/ Hex Artifact Content
Login

Artifact cf45d7b1cd27341ba8699e62c4902062b6297039:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0cd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0ce0: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0cf0: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0d00: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0d10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0d30: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0d40: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0d50: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0d60: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0d70: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0d80: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0d90: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0da0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0db0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0dc0: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0dd0: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0de0: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0df0: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0e00: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0e10: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0e20: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0e30: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0e40: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0e50: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0e60: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0e70: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0e80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0e90: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0ea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0eb0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
0ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0ed0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
0ee0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ef0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0f00: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0f10: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0f20: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0f30: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0f40: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0f50: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0f60: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0f70: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0f80: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0f90: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0fa0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0fb0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0fc0: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0fd0: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0fe0: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0ff0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1000: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1010: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1020: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1040: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1060: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1070: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
1080: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
1090: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
10a0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
10b0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
10c0: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10d0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
10e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10f0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1100: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1110: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1120: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1130: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1140: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1160: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1170: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1190: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
11a0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
11b0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
11c0: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
11d0: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
11e0: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
11f0: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1200: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1210: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
1220: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
1230: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
1240: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
1250: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1260: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1270: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1280: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1290: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
12a0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
12b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
12c0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12d0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
12e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
12f0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1300: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1310: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1320: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1330: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1340: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1350: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1360: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1370: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1380: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
13a0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
13b0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
13c0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
13d0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
13e0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
13f0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1400: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1410: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1420: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1430: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1440: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1450: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1460: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1470: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1480: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1490: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
14a0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
14b0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
14c0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
14d0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
14e0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
14f0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1500: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1510: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1520: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1530: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1540: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1550: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1560: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1570: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1580: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
15b0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
15c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
15e0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
15f0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1600: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1610: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1620: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1630: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1640: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1650: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1660: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1670: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1680: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1690: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
16a0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
16b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
16c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16d0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
16e0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
16f0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1700: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1710: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1730: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1740: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1770: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1780: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1790: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
17c0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
17d0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1820: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1840: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1850: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1860: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1870: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1880: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1890: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
18a0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
18b0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
18e0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
18f0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1900: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1910: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1920: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1930: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1940: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1950: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1970: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1980: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
19d0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1a00: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1a10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1a20: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1a50: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1a70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a80: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ab0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1ac0: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1ad0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ae0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1af0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1b00: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b10: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b30: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1b40: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1b50: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b60: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b80: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1b90: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ba0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1bb0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1bc0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1bf0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1c10: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1c20: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c40: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1c60: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1c80: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1c90: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1cd0: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1d00: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1d10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1d30: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1d40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1d60: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d70: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1d80: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1d90: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1da0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1db0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1dc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1dd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1de0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1df0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e00: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e20: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1e30: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1e40: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e60: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1e70: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1e80: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1e90: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1ea0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1eb0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1ec0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1ed0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1ee0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f00: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f20: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1f30: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1f40: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1f50: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1f60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1f70: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1f80: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fd0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ff0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2000: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2010: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2020: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2040: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2060: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2070: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2080: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2090: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
20a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
20b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
20d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
20e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
20f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2100: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2110: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2120: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2130: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2140: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2150: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2160: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2170: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2180: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2190: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
21a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
21b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
21c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
21d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
21e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
21f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2200: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2210: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2220: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2230: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2240: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2250: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2260: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2270: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2280: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2290: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
22a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
22b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
22c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
22d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
22e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
22f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2300: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2310: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2320: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2330: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2340: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2350: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2360: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2370: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2380: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2390: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
23a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
23b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
23c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
23d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
23e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
23f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2400: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2410: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2420: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2430: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2440: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2450: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2480: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2490: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
24a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
24d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
24e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
24f0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2500: 45 5f 57 41 52 4e 45 44 20 20 20 20 30 78 30 31  E_WARNED    0x01
2510: 30 30 20 20 20 20 20 2f 2a 20 76 65 72 69 66 79  00     /* verify
2520: 44 62 46 69 6c 65 28 29 20 77 61 72 6e 69 6e 67  DbFile() warning
2530: 73 20 69 73 73 75 65 64 20 2a 2f 0a 23 64 65 66  s issued */.#def
2540: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f  ine UNIXFILE_BLO
2550: 43 4b 20 20 20 20 20 30 78 30 32 30 30 20 20 20  CK     0x0200   
2560: 20 20 2f 2a 20 4e 65 78 74 20 53 48 4d 20 6c 6f    /* Next SHM lo
2570: 63 6b 20 6d 69 67 68 74 20 62 6c 6f 63 6b 20 2a  ck might block *
2580: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  /../*.** Include
2590: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
25a0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
25b0: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
25c0: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
25d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  h"../*.** Define
25e0: 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20   various macros 
25f0: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
2600: 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65   from some syste
2610: 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ms..*/.#ifndef O
2620: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
2630: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
2640: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
2650: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
2660: 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52  FS.# undef O_LAR
2670: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2680: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2690: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e  ndif.#ifndef O_N
26a0: 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65  OFOLLOW.# define
26b0: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65   O_NOFOLLOW 0.#e
26c0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42  ndif.#ifndef O_B
26d0: 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f  INARY.# define O
26e0: 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66  _BINARY 0.#endif
26f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
2700: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
2710: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
2720: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
2730: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
2740: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
2750: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51   only..*/.#if SQ
2760: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
2770: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
2780: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
2790: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68  #else.#define th
27a0: 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a  readid 0.#endif.
27b0: 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d  ./*.** HAVE_MREM
27c0: 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74  AP defaults to t
27d0: 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64  rue on Linux and
27e0: 20 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72   false everywher
27f0: 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  e else..*/.#if !
2800: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45  defined(HAVE_MRE
2810: 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65  MAP).# if define
2820: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
2830: 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55  defined(_GNU_SOU
2840: 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48  RCE).#  define H
2850: 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65  AVE_MREMAP 1.# e
2860: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41  lse.#  define HA
2870: 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e  VE_MREMAP 0.# en
2880: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  dif.#endif../*.*
2890: 2a 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c  * Explicitly cal
28a0: 6c 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72  l the 64-bit ver
28b0: 73 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20  sion of lseek() 
28c0: 6f 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65  on Android. Othe
28d0: 72 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a  rwise, lseek().*
28e0: 2a 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20  * is the 32-bit 
28f0: 76 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66  version, even if
2900: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
2910: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
2920: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e  ..*/.#ifdef __AN
2930: 44 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65  DROID__.# define
2940: 20 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23   lseek lseek64.#
2950: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  endif../*.** Dif
2960: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
2970: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
2980: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
2990: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
29a0: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
29b0: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
29c0: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
29d0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
29e0: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
29f0: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
2a00: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
2a10: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
2a20: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
2a30: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
2a40: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
2a50: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
2a60: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
2a70: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
2a80: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
2a90: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
2aa0: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
2ab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
2ac0: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
2ad0: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
2ae0: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
2af0: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
2b00: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
2b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f  ;.}../*.** On so
2b20: 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c  me systems, call
2b30: 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69  s to fchown() wi
2b40: 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73  ll trigger a mes
2b50: 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69  sage in a securi
2b60: 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65  ty.** log if the
2b70: 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d  y come from non-
2b80: 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20  root processes. 
2b90: 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e   So avoid callin
2ba0: 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a  g fchown() if.**
2bb0: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
2bc0: 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a  ing as root..*/.
2bd0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2be0: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
2bf0: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
2c00: 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  gid){.#if OS_VXW
2c10: 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b  ORKS.  return 0;
2c20: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
2c30: 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20  geteuid() ? 0 : 
2c40: 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69  fchown(fd,uid,gi
2c50: 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  d);.#endif.}../*
2c60: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
2c70: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
2c80: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
2c90: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
2ca0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
2cb0: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
2cc0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
2cd0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2ce0: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2cf0: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2d00: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2d10: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2d20: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2d30: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2d40: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2d50: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2d60: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2d70: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2d80: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2d90: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2da0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2db0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2dc0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
2dd0: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
2de0: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
2df0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e10: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
2e20: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
2e30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
2e40: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
2e50: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
2e60: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
2e70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2e80: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
2e90: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
2ea0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
2eb0: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
2ec0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
2ed0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
2ee0: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
2ef0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
2f00: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
2f10: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
2f20: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
2f30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
2f40: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
2f50: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2f60: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
2f70: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
2f80: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
2f90: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
2fa0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
2fb0: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
2fc0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2fd0: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
2fe0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
2ff0: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
3000: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3010: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
3020: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3030: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
3040: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3050: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
3060: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3070: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
3080: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
3090: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
30a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
30b0: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
30c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
30d0: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
30e0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
30f0: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
3100: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3110: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3120: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3130: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
3140: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
3150: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
3160: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
3170: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
3180: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
3190: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
31a0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
31b0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
31c0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
31d0: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
31e0: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
31f0: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
3200: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
3210: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
3220: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
3230: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
3240: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
3250: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3260: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3270: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3280: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
3290: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
32a0: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
32b0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
32c0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
32d0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
32e0: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
32f0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
3300: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3310: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
3320: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
3330: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
3340: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3350: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
3360: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
3370: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
3380: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
3390: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
33a0: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
33b0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
33c0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
33d0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
33e0: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
33f0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
3400: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
3410: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3420: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
3430: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3440: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
3450: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3460: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
3470: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
3480: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
3490: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
34a0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
34b0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
34c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
34d0: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
34e0: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
34f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3500: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
3510: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3520: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3530: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3540: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3550: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3560: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
3570: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3580: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
3590: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
35a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
35b0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
35c0: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
35d0: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
35e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
35f0: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
3600: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3610: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3620: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3630: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3640: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3650: 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73  osPread64   ((ss
3660: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
3670: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3680: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
3690: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
36a0: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
36b0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
36c0: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
36d0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
36e0: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
36f0: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3700: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3710: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3720: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3730: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3740: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3750: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3760: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
3770: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3780: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
3790: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
37a0: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
37b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
37c0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
37d0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
37e0: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
37f0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3800: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3810: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3840: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3850: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3860: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3870: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3880: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3890: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
38a0: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
38b0: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
38c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
38d0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
38e0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
38f0: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3900: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3910: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3920: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3930: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
3940: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3950: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
3960: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3970: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3980: 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  mod,     0  },.#
3990: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
39a0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
39b0: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
39c0: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
39d0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
39e0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
39f0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3a00: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3a10: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3a20: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3a30: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3a40: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3a50: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3a60: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3a70: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3a80: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3a90: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3aa0: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3ab0: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3ac0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3ad0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ae0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3af0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3b00: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3b10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3b20: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3b30: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3b40: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3b50: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3b60: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3b70: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3b80: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3b90: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3ba0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3bb0: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3bc0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3bd0: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3be0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3bf0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3c00: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c10: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3c20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c30: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3c40: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3c50: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3c60: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3c70: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3c80: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3c90: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ca0: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3cb0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3cc0: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3cd0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3ce0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3cf0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3d00: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3d10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3d20: 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20  r)posixFchown,  
3d30: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3d40: 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e  osFchown    ((in
3d50: 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67  t(*)(int,uid_t,g
3d60: 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  id_t))aSyscall[2
3d70: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3d80: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3d90: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
3da0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
3db0: 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22  IZE>0.  { "mmap"
3dc0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3dd0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61  _syscall_ptr)mma
3de0: 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  p,     0 },.#def
3df0: 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69  ine osMmap ((voi
3e00: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3e10: 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f  _t,int,int,int,o
3e20: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ff_t))aSyscall[2
3e30: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
3e40: 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20  { "munmap",     
3e50: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3e60: 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20  ll_ptr)munmap,  
3e70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3e80: 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28  fine osMunmap ((
3e90: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
3ea0: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3eb0: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
3ec0: 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
3ed0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
3ee0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3ef0: 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20  all_ptr)mremap, 
3f00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3f10: 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22  lse.  { "mremap"
3f20: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3f30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3f50: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3f60: 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f 69  e osMremap ((voi
3f70: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3f80: 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e  _t,size_t,int,..
3f90: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  .))aSyscall[23].
3fa0: 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20 22 67  pCurrent).  { "g
3fb0: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
3fc0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3fd0: 74 72 29 75 6e 69 78 47 65 74 70 61 67 65 73 69  tr)unixGetpagesi
3fe0: 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65  ze, 0 },.#define
3ff0: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
4000: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
4010: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
4020: 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b  ent)..#endif..};
4030: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
4040: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
4050: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
4060: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
4070: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
4080: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
4090: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
40a0: 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56   the.** "unix" V
40b0: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
40c0: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
40d0: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
40e0: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
40f0: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
4100: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
4110: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
4120: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
4130: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
4140: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
4150: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53  tic int unixSetS
4160: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4170: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4180: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
4190: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
41a0: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
41b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
41d0: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
41e0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
41f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
4200: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
4210: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
4220: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
4230: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
4240: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
4250: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4260: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
4270: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
4280: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
4290: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
42a0: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
42b0: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
42c0: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
42d0: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
42e0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
42f0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
4300: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
4310: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
4320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
4330: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
4340: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
4350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4360: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
4370: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
4380: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
4390: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
43a0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
43b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
43c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
43d0: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
43e0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
43f0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
4400: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
4410: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
4420: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4430: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
4440: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
4450: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
4460: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
4470: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4480: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
4490: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
44a0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
44b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
44c0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
44d0: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
44e0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
44f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
4500: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
4510: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
4520: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
4530: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
4540: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
4550: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4560: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
4570: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4580: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4590: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
45a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
45b0: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
45c0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
45d0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
45e0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
45f0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
4600: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
4610: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
4620: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
4630: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
4640: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
4650: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
4660: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69  _syscall_ptr uni
4670: 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xGetSystemCall(.
4680: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
4690: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
46a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
46b0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
46c0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
46d0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
46e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
46f0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
4700: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
4710: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
4720: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
4730: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4740: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
4750: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4760: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
4770: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
4780: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
4790: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
47a0: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
47b0: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
47c0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
47d0: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
47e0: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
47f0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4800: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
4810: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
4820: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
4830: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
4840: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
4850: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
4860: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
4870: 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74  ar *unixNextSyst
4880: 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76  emCall(sqlite3_v
4890: 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  fs *p, const cha
48a0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
48b0: 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53   i = -1;..  UNUS
48c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
48d0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
48e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
48f0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
4900: 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l)-1; i++){.    
4910: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
4920: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4930: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
4940: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
4950: 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53  or(i++; i<ArrayS
4960: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69  ize(aSyscall); i
4970: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79  ++){.    if( aSy
4980: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4990: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  t!=0 ) return aS
49a0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b  yscall[i].zName;
49b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
49c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  .}../*.** Do not
49d0: 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65   accept any file
49e0: 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73   descriptor less
49f0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
4a00: 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  , in order to av
4a10: 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64  oid.** opening d
4a20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69  atabase file usi
4a30: 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ng file descript
4a40: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ors that are com
4a50: 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a  monly used for .
4a60: 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  ** standard inpu
4a70: 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65  t, output, and e
4a80: 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rror..*/.#ifndef
4a90: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
4aa0: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a  FILE_DESCRIPTOR.
4ab0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
4ac0: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
4ad0: 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66  CRIPTOR 3.#endif
4ae0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f  ../*.** Invoke o
4af0: 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75  pen().  Do so mu
4b00: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e  ltiple times, un
4b10: 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73 75  til it either su
4b20: 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69  cceeds or.** fai
4b30: 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73  ls for some reas
4b40: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49  on other than EI
4b50: 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  NTR..**.** If th
4b60: 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20  e file creation 
4b70: 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74 68  mode "m" is 0 th
4b80: 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68 65  en set it to the
4b90: 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20   default for.** 
4ba0: 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66  SQLite.  The def
4bb0: 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44  ault is SQLITE_D
4bc0: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
4bd0: 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c  ISSIONS (normall
4be0: 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f  y.** 0644) as mo
4bf0: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73 79  dified by the sy
4c00: 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20  stem umask.  If 
4c10: 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  m is not 0, then
4c20: 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c  .** make the fil
4c30: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
4c40: 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e  be exactly m ign
4c50: 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e  oring the umask.
4c60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72  .**.** The m par
4c70: 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e  ameter will be n
4c80: 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65  on-zero only whe
4c90: 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c  n creating -wal,
4ca0: 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e   -journal,.** an
4cb0: 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57  d -shm files.  W
4cc0: 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c  e want those fil
4cd0: 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63  es to have *exac
4ce0: 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a  tly* the same.**
4cf0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20   permissions as 
4d00: 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
4d10: 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74  atabase, unadult
4d20: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75 6d  erated by the um
4d30: 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  ask..** In that 
4d40: 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62 61  way, if a databa
4d50: 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72  se file is -rw-r
4d60: 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72  w-rw or -rw-rw-r
4d70: 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e  -, and a.** tran
4d80: 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20  saction crashes 
4d90: 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e  and leaves behin
4da0: 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20  d hot journals, 
4db0: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63  then any.** proc
4dc0: 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c 65  ess that is able
4dd0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
4de0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61   database will a
4df0: 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a  lso be able to.*
4e00: 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f  * recover the ho
4e10: 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73  t journals..*/.s
4e20: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4e30: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
4e40: 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65   *z, int f, mode
4e50: 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b  _t m){.  int fd;
4e60: 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d  .  mode_t m2 = m
4e70: 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45   ? m : SQLITE_DE
4e80: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
4e90: 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28  SSIONS;.  while(
4ea0: 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  1){.#if defined(
4eb0: 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66  O_CLOEXEC).    f
4ec0: 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f  d = osOpen(z,f|O
4ed0: 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65  _CLOEXEC,m2);.#e
4ee0: 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f  lse.    fd = osO
4ef0: 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e  pen(z,f,m2);.#en
4f00: 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30  dif.    if( fd<0
4f10: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
4f20: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e  rno==EINTR ) con
4f30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65  tinue;.      bre
4f40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
4f50: 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e  ( fd>=SQLITE_MIN
4f60: 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49  IMUM_FILE_DESCRI
4f70: 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20  PTOR ) break;.  
4f80: 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20    osClose(fd);. 
4f90: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
4fa0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a  QLITE_WARNING, .
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fc0: 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e  "attempt to open
4fd0: 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20   \"%s\" as file 
4fe0: 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20  descriptor %d", 
4ff0: 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d  z, fd);.    fd =
5000: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f   -1;.    if( osO
5010: 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
5020: 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b   f, m)<0 ) break
5030: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d  ;.  }.  if( fd>=
5040: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d  0 ){.    if( m!=
5050: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
5060: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a  t stat statbuf;.
5070: 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
5080: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d  t(fd, &statbuf)=
5090: 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74  =0 .       && st
50a0: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
50b0: 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74  .       && (stat
50c0: 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  buf.st_mode&0777
50d0: 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20  )!=m .      ){. 
50e0: 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28         osFchmod(
50f0: 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, m);.      }.
5100: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
5110: 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26  d(FD_CLOEXEC) &&
5120: 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f   (!defined(O_CLO
5130: 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58  EXEC) || O_CLOEX
5140: 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e  EC==0).    osFcn
5150: 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
5160: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
5170: 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
5180: 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
5190: 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d  }.  return fd;.}
51a0: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
51b0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
51c0: 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
51d0: 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
51e0: 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
51f0: 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
5200: 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75  to protect the u
5210: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64  nixInodeInfo and
5220: 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  .** vxworksFileI
5230: 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  d objects used b
5240: 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  y this file, all
5250: 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
5260: 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d   .** shared by m
5270: 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
5280: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
5290: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
52a0: 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
52b0: 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
52c0: 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
52d0: 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
52e0: 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
52f0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
5300: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
5310: 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
5320: 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
5330: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
5340: 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
5350: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5360: 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74   );.**   unixEnt
5370: 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61  erLeave().*/.sta
5380: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74  tic void unixEnt
5390: 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
53a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
53b0: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
53c0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
53d0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
53e0: 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
53f0: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
5400: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
5410: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
5420: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5430: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5440: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
5450: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5460: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
5470: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f  unixMutexHeld(vo
5480: 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
5490: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
54a0: 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
54b0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
54c0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
54d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
54e0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
54f0: 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48  OS_TRACE./*.** H
5500: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
5510: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
5520: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
5530: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
5540: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
5550: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
5560: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
5570: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
5580: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
5590: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
55a0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
55b0: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
55c0: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
55d0: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
55e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
55f0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
5600: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
5610: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
5620: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
5630: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
5640: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
5650: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
5660: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
5670: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
5680: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
5690: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
56a0: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
56b0: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
56c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
56d0: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
56e0: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
56f0: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
5700: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
5710: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
5720: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5730: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
5740: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
5750: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
5760: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
5770: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
5780: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
5790: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
57a0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
57b0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
57c0: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
57d0: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
57e0: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
57f0: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
5800: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
5810: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
5820: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
5830: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
5840: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
5850: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
5860: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
5870: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
5880: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
5890: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
58a0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
58b0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
58c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
58d0: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
58e0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
58f0: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
5900: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
5910: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
5920: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
5930: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
5940: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
5950: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
5960: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
5970: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
5980: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
5990: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
59a0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
59b0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
59c0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
59d0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
59e0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
59f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
5a00: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
5a10: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
5a20: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
5a30: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
5a40: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
5a50: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
5a60: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
5a70: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
5a80: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
5a90: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
5aa0: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
5ab0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
5ac0: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
5ad0: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
5ae0: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
5af0: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
5b00: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
5b10: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
5b20: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
5b30: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
5b40: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
5b50: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
5b60: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
5b70: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
5b80: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
5b90: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
5ba0: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
5bb0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
5bc0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
5bd0: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
5be0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5bf0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
5c00: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
5c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5c20: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
5c30: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5c40: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
5c50: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
5c60: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
5c70: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
5c80: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
5c90: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
5ca0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
5cb0: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
5cc0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
5cd0: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
5ce0: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
5cf0: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
5d00: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
5d10: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
5d20: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
5d30: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
5d40: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
5d50: 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c  o EINTR.**.** Al
5d60: 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e  l calls to ftrun
5d70: 63 61 74 65 28 29 20 77 69 74 68 69 6e 20 74 68  cate() within th
5d80: 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  is file should b
5d90: 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68 0a 2a  e made through.*
5da0: 2a 20 74 68 69 73 20 77 72 61 70 70 65 72 2e 20  * this wrapper. 
5db0: 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69 64 20   On the Android 
5dc0: 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61 73 73  platform, bypass
5dd0: 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20 62 65  ing the logic be
5de0: 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61  low.** could lea
5df0: 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74 20 64  d to a corrupt d
5e00: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
5e10: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
5e20: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
5e30: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
5e40: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64  {.  int rc;.#ifd
5e50: 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20  ef __ANDROID__. 
5e60: 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20   /* On Android, 
5e70: 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c 77 61  ftruncate() alwa
5e80: 79 73 20 75 73 65 73 20 33 32 2d 62 69 74 20 6f  ys uses 32-bit o
5e90: 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69 66 20  ffsets, even if 
5ea0: 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53  .  ** _FILE_OFFS
5eb0: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
5ec0: 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  fined. This mean
5ed0: 73 20 69 74 20 69 73 20 75 6e 73 61 66 65 20 74  s it is unsafe t
5ee0: 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a  o attempt to.  *
5ef0: 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  * truncate a fil
5f00: 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61  e to any size la
5f10: 72 67 65 72 20 74 68 61 6e 20 32 47 69 42 2e 20  rger than 2GiB. 
5f20: 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20  Silently ignore 
5f30: 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 61 74  any.  ** such at
5f40: 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66  tempts.  */.  if
5f50: 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e  ( sz>(sqlite3_in
5f60: 74 36 34 29 30 78 37 46 46 46 46 46 46 46 20 29  t64)0x7FFFFFFF )
5f70: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
5f80: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  E_OK;.  }else.#e
5f90: 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20  ndif.  do{ rc = 
5fa0: 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a  osFtruncate(h,sz
5fb0: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
5fc0: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
5fd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5ff0: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
6000: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
6010: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
6020: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
6030: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
6040: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
6050: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
6060: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
6070: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
6080: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
6090: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
60a0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
60b0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
60c0: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
60d0: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
60e0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
60f0: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
6100: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
6110: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
6120: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
6130: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
6140: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
6150: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
6160: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
6170: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
6180: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
6190: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
61a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
61b0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
61c0: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
61d0: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
61e0: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
61f0: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
6200: 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74 20  {.#if 0.  /* At 
6210: 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 63  one point this c
6220: 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d  ode was not comm
6230: 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74 68  ented out. In th
6240: 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e 63  eory, this branc
6250: 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65  h.  ** should ne
6260: 76 65 72 20 62 65 20 68 69 74 2c 20 61 73 20 74  ver be hit, as t
6270: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
6280: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
6290: 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61 20  ed after.  ** a 
62a0: 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20  locking-related 
62b0: 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66  function (i.e. f
62c0: 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74 75  cntl()) has retu
62d0: 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69  rned non-zero wi
62e0: 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  th.  ** the valu
62f0: 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74 68  e of errno as th
6300: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
6310: 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74 65 6d  . Since a system
6320: 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65 64   call has failed
6330: 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f  ,.  ** errno sho
6340: 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e  uld be non-zero.
6350: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69  .  **.  ** Despi
6360: 74 65 20 74 68 69 73 2c 20 69 66 20 65 72 72 6e  te this, if errn
6370: 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f  o really is zero
6380: 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74  , we still don't
6390: 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a   want to return.
63a0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20    ** SQLITE_OK. 
63b0: 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  The system call 
63c0: 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d  failed, and *som
63d0: 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  e* SQLite error 
63e0: 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70  should be.  ** p
63f0: 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20 74  ropagated back t
6400: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f  o the caller. Co
6410: 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62 72  mmenting this br
6420: 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20 65  anch out means e
6430: 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c  rrno==0.  ** wil
6440: 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  l be handled by 
6450: 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20 63  the "default:" c
6460: 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  ase below..  */.
6470: 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72    case 0: .    r
6480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6490: 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20  .#endif..  case 
64a0: 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45  EAGAIN:.  case E
64b0: 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65  TIMEDOUT:.  case
64c0: 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45   EBUSY:.  case E
64d0: 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f  INTR:.  case ENO
64e0: 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61  LCK:  .    /* ra
64f0: 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65  ndom NFS retry e
6500: 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72  rror, unless dur
6510: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
6520: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
6530: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
6540: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
6550: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
6560: 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65  t says */.    re
6570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
6580: 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41  ;.    .  case EA
6590: 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41  CCES: .    /* EA
65a0: 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47  CCES is like EAG
65b0: 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69  AIN during locki
65c0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62  ng operations, b
65d0: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72  ut not any other
65e0: 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20   time*/.    if( 
65f0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6600: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
6610: 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28  K) || .        (
6620: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
6630: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
6640: 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  CK) || .        
6650: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6660: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
6670: 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  OCK) ||.        
6680: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6690: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
66a0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20  CKRESERVEDLOCK) 
66b0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
66c0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
66d0: 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66   }.    /* else f
66e0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
66f0: 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20   case EPERM: .  
6700: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6710: 50 45 52 4d 3b 0a 20 20 20 20 0a 23 69 66 20 45  PERM;.    .#if E
6720: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
6730: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
6740: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
6750: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
6760: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
6770: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
6780: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
6790: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
67a0: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
67b0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
67c0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
67d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
67e0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
67f0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
6800: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
6810: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
6820: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
6830: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
6840: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
6850: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
6860: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
6870: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
6880: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
6890: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
68a0: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
68b0: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
68c0: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
68d0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65  se ENOENT:.#ifde
68e0: 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20 20  f ESTALE        
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6900: 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64 65  ESTALE is not de
6910: 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69 78  fined on Interix
6920: 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61   systems */.  ca
6930: 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69  se ESTALE:.#endi
6940: 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  f.  case ENOSYS:
6950: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
6960: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
6970: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
6980: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
6990: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
69a0: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
69b0: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
69c0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  ;.  }.}.../*****
69d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
6a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
6a30: 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  in Unique File I
6a40: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
6a50: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
6a70: 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73  On most versions
6a80: 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e   of unix, we can
6a90: 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49 44   get a unique ID
6aa0: 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63   for a file by c
6ab0: 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20  oncatenating.** 
6ac0: 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65  the device numbe
6ad0: 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20  r and the inode 
6ae0: 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69  number.  But thi
6af0: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
6b00: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f  on VxWorks..** O
6b10: 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69  n VxWorks, a uni
6b20: 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74  que file id must
6b30: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
6b40: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
6b50: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ame..**.** A poi
6b60: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
6b70: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
6b80: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
6b90: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 0a  an be used as a.
6ba0: 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49  ** unique file I
6bb0: 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45  D in VxWorks.  E
6bc0: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
6bd0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 63  this structure c
6be0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70  ontains.** a cop
6bf0: 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63  y of the canonic
6c00: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68  al filename.  Th
6c10: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65  ere is also a re
6c20: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20  ference count.  
6c30: 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75 72  .** The structur
6c40: 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77  e is reclaimed w
6c50: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
6c60: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74  f pointers to it
6c70: 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72   drops to.** zer
6c80: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  o..**.** There a
6c90: 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61  re never very ma
6ca0: 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74  ny files open at
6cb0: 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f   one time and lo
6cc0: 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  okups are not.**
6cd0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63   a performance-c
6ce0: 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f  ritical path, so
6cf0: 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e   it is sufficien
6d00: 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a  t to put these.*
6d10: 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20  * structures on 
6d20: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a  a linked list..*
6d30: 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  /.struct vxworks
6d40: 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63  FileId {.  struc
6d50: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6d60: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
6d70: 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68   in a list of th
6d80: 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  em all */.  int 
6d90: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
6da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6db0: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
6dc0: 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f  s to this one */
6dd0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
6e00: 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  e zCanonicalName
6e10: 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63  [] string */.  c
6e20: 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e  har *zCanonicalN
6e30: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ame;         /* 
6e40: 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  Canonical filena
6e50: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53  me */.};..#if OS
6e60: 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20  _VXWORKS./* .** 
6e70: 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e  All unique filen
6e80: 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ames are held on
6e90: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68   a linked list h
6ea0: 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  eaded by this.**
6eb0: 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74   variable:.*/.st
6ec0: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
6ed0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
6ee0: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a  ksFileList = 0;.
6ef0: 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20  ./*.** Simplify 
6f00: 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  a filename into 
6f10: 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f  its canonical fo
6f20: 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20  rm.** by making 
6f30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  the following ch
6f40: 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20  anges:.**.**  * 
6f50: 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61  removing any tra
6f60: 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63  iling and duplic
6f70: 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ate /.**  * conv
6f80: 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73  ert /./ into jus
6f90: 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  t /.**  * conver
6fa0: 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41  t /A/../ where A
6fb0: 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e   is any simple n
6fc0: 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  ame into just /.
6fd0: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72  **.** Changes ar
6fe0: 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e  e made in-place.
6ff0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
7000: 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a   name length..**
7010: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
7020: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20   filename is in 
7030: 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75  z[0..n-1].  Retu
7040: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
7050: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
7060: 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64  n the simplified
7070: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
7080: 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70   int vxworksSimp
7090: 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a  lifyName(char *z
70a0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
70b0: 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  i, j;.  while( n
70c0: 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f  >1 && z[n-1]=='/
70d0: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f  ' ){ n--; }.  fo
70e0: 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
70f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
7100: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
7110: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29  f( z[i+1]=='/' )
7120: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7130: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
7140: 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69   && i+2<n && z[i
7150: 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +2]=='/' ){.    
7160: 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20      i += 1;.    
7170: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7180: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7190: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
71a0: 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +3<n && z[i+2]==
71b0: 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27  '.' && z[i+3]=='
71c0: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  /' ){.        wh
71d0: 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d  ile( j>0 && z[j-
71e0: 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20  1]!='/' ){ j--; 
71f0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
7200: 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  0 ){ j--; }.    
7210: 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
7220: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7240: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
7250: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
7260: 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a   return j;.}../*
7270: 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75  .** Find a uniqu
7280: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68  e file ID for th
7290: 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65  e given absolute
72a0: 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75   pathname.  Retu
72b0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
72c0: 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  to the vxworksFi
72d0: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68  leId object.  Th
72e0: 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68  is pointer is th
72f0: 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65  e unique.** file
7300: 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   ID..**.** The n
7310: 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Ref field of the
7320: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
7330: 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65  bject is increme
7340: 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  nted before.** t
7350: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74  he object is ret
7360: 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78  urned.  A new vx
7370: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7380: 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  ct is created.**
7390: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
73a0: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66  e global list if
73b0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
73c0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
73d0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
73e0: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
73f0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  LL..*/.static st
7400: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7410: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46  Id *vxworksFindF
7420: 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72  ileId(const char
7430: 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29   *zAbsoluteName)
7440: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
7450: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20  ksFileId *pNew; 
7460: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63          /* searc
7470: 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69  h key and new fi
7480: 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63  le ID */.  struc
7490: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
74a0: 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f  *pCandidate;   /
74b0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
74c0: 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  er existing file
74d0: 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b   IDs */.  int n;
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7500: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f   Length of zAbso
7510: 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20  luteName string 
7520: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41  */..  assert( zA
7530: 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d  bsoluteName[0]==
7540: 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e  '/' );.  n = (in
7550: 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75  t)strlen(zAbsolu
7560: 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20  teName);.  pNew 
7570: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
7580: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
7590: 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28  + (n+1) );.  if(
75a0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
75b0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61  n 0;.  pNew->zCa
75c0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63  nonicalName = (c
75d0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
75e0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43   memcpy(pNew->zC
75f0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41  anonicalName, zA
7600: 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31  bsoluteName, n+1
7610: 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73  );.  n = vxworks
7620: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65  SimplifyName(pNe
7630: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7640: 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  e, n);..  /* Sea
7650: 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
7660: 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d  ing entry that m
7670: 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f  atching the cano
7680: 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a  nical name..  **
7690: 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65   If found, incre
76a0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
76b0: 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74  ce count and ret
76c0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
76d0: 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69  .  ** the existi
76e0: 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f  ng file ID..  */
76f0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
7700: 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64  x();.  for(pCand
7710: 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c  idate=vxworksFil
7720: 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74  eList; pCandidat
7730: 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43  e; pCandidate=pC
7740: 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29  andidate->pNext)
7750: 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69  {.    if( pCandi
7760: 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a  date->nName==n .
7770: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
7780: 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f  Candidate->zCano
7790: 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d  nicalName, pNew-
77a0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
77b0: 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20   n)==0.    ){.  
77c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
77d0: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
77e0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66  pCandidate->nRef
77f0: 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c  ++;.       unixL
7800: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
7810: 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64      return pCand
7820: 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  idate;.    }.  }
7830: 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20  ..  /* No match 
7840: 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77  was found.  We w
7850: 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66  ill make a new f
7860: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77  ile ID */.  pNew
7870: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e  ->nRef = 1;.  pN
7880: 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20  ew->nName = n;. 
7890: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76   pNew->pNext = v
78a0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a  xworksFileList;.
78b0: 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73    vxworksFileLis
78c0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78  t = pNew;.  unix
78d0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
78e0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
78f0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
7900: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
7910: 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73  unt on a vxworks
7920: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
7930: 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  Free.** the obje
7940: 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ct when the refe
7950: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
7960: 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  hes zero..*/.sta
7970: 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73  tic void vxworks
7980: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74  ReleaseFileId(st
7990: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
79a0: 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  Id *pId){.  unix
79b0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
79c0: 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65  assert( pId->nRe
79d0: 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52  f>0 );.  pId->nR
79e0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d  ef--;.  if( pId-
79f0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
7a00: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7a10: 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66  leId **pp;.    f
7a20: 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69  or(pp=&vxworksFi
7a30: 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a  leList; *pp && *
7a40: 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28  pp!=pId; pp = &(
7a50: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d  (*pp)->pNext)){}
7a60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
7a70: 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70  ==pId );.    *pp
7a80: 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20   = pId->pNext;. 
7a90: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7aa0: 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  pId);.  }.  unix
7ab0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
7ac0: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
7ad0: 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORKS */./*******
7ae0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
7af0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
7b00: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
7b10: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
7b20: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
7b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b70: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
7b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
7bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7be0: 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69  ***** Posix Advi
7bf0: 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  sory Locking ***
7c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
7c20: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
7c30: 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  ocks are broken 
7c40: 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49  by design.  ANSI
7c50: 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39   STD 1003.1 (199
7c60: 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e  6).** section 6.
7c70: 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20  5.2.2 lines 483 
7c80: 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63  through 490 spec
7c90: 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20  ify that when a 
7ca0: 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20  process.** sets 
7cb0: 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b  or clears a lock
7cc0: 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  , that operation
7cd0: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
7ce0: 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a  rior locks set.*
7cf0: 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  * by the same pr
7d00: 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20  ocess.  It does 
7d10: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
7d20: 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20  ay so, but this 
7d30: 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20  implies.** that 
7d40: 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63  it overrides loc
7d50: 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61  ks set by the sa
7d60: 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67  me process using
7d70: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
7d80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
7d90: 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
7da0: 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a  test case:.**.**
7db0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d         int fd1 =
7dc0: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c   open("./file1",
7dd0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
7de0: 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20   0644);.**      
7df0: 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28   int fd2 = open(
7e00: 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57  "./file2", O_RDW
7e10: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
7e20: 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ;.**.** Suppose 
7e30: 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69  ./file1 and ./fi
7e40: 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74  le2 are really t
7e50: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65  he same file (be
7e60: 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20  cause.** one is 
7e70: 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c  a hard or symbol
7e80: 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f  ic link to the o
7e90: 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f  ther) then if yo
7ea0: 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c  u set.** an excl
7eb0: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64  usive lock on fd
7ec0: 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67  1, then try to g
7ed0: 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
7ee0: 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20  lock.** on fd2, 
7ef0: 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75  it works.  I wou
7f00: 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64  ld have expected
7f10: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b   the second lock
7f20: 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63   to.** fail sinc
7f30: 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65  e there was alre
7f40: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ady a lock on th
7f50: 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64  e file due to fd
7f60: 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f  1..** But not so
7f70: 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f  .  Since both lo
7f80: 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68  cks came from th
7f90: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20  e same process, 
7fa0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76  the.** second ov
7fb0: 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73  errides the firs
7fc0: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
7fd0: 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66  hey were on diff
7fe0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
7ff0: 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
8000: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69   on different fi
8010: 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  le names..**.** 
8020: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
8030: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
8040: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
8050: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
8060: 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f  cess.** among co
8070: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
8080: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
8090: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
80a0: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
80b0: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
80c0: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
80d0: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
80e0: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
80f0: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
8100: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
8110: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
8120: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
8130: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
8140: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
8150: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
8160: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
8170: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
8180: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
8190: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
81a0: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
81b0: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
81c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
81d0: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
81e0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
81f0: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
8200: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
8210: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
8220: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
8230: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
8240: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
8250: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
8260: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
8270: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
8280: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
8290: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
82a0: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
82b0: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
82c0: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
82d0: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
82e0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
82f0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
8300: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
8310: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
8320: 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68  **.** (Aside: Th
8330: 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e  e use of inode n
8340: 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65  umbers as unique
8350: 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f   IDs does not wo
8360: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
8370: 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77  * For VxWorks, w
8380: 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68  e have to use th
8390: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e  e alternative un
83a0: 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62  ique ID system b
83b0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e  ased on.** canon
83c0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e  ical filename an
83d0: 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  d implemented in
83e0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69   the previous di
83f0: 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54  vision.).**.** T
8400: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
8410: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f  structure for PO
8420: 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  SIX is no longer
8430: 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72   just an integer
8440: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
8450: 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20  tor.  It is now 
8460: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
8470: 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67   holds the integ
8480: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
8490: 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e  iptor and a poin
84a0: 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75  ter to a structu
84b0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
84c0: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  s the internal.*
84d0: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63  * locks on the c
84e0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f  orresponding ino
84f0: 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  de.  There is on
8500: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
8510: 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65  ure.** per inode
8520: 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65  , so if the same
8530: 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64   inode is opened
8540: 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69   twice, both uni
8550: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73  xFile structures
8560: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
8570: 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74   same locking st
8580: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f  ructure.  The lo
8590: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
85a0: 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72  keeps.** a refer
85b0: 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77  ence count (so w
85c0: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e  e will know when
85d0: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61   to delete it) a
85e0: 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69  nd a "cnt".** fi
85f0: 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75  eld that tells u
8600: 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c  s its internal l
8610: 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74  ock status.  cnt
8620: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ==0 means the.**
8630: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
8640: 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e  d.  cnt==-1 mean
8650: 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  s the file has a
8660: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
8670: 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73  ..** cnt>0 means
8680: 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73   there are cnt s
8690: 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74  hared locks on t
86a0: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  he file..**.** A
86b0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ny attempt to lo
86c0: 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66  ck or unlock a f
86d0: 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73  ile first checks
86e0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   the locking.** 
86f0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
8700: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
8710: 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f  all is only invo
8720: 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a  ked to set a .**
8730: 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74   POSIX lock if t
8740: 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  he internal lock
8750: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
8760: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a  itions between.*
8770: 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61  * a locked and a
8780: 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65  n unlocked state
8790: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74  ..**.** But wait
87a0: 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74  :  there are yet
87b0: 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77   more problems w
87c0: 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f  ith POSIX adviso
87d0: 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ry locks..**.** 
87e0: 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66  If you close a f
87f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
8800: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  hat points to a 
8810: 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f  file that has lo
8820: 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b  cks,.** all lock
8830: 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  s on that file t
8840: 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79  hat are owned by
8850: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
8860: 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65  cess are.** rele
8870: 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61  ased.  To work a
8880: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
8890: 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f  em, each unixIno
88a0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  deInfo object.**
88b0: 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75   maintains a cou
88c0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
88d0: 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   of pending lock
88e0: 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a  s on tha inode..
88f0: 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  ** When an attem
8900: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
8910: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
8920: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
8930: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
8940: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
8950: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
8960: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
8970: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
8980: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
8990: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
89a0: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
89b0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
89c0: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49  ar..** The unixI
89d0: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
89e0: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
89f0: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
8a00: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
8a10: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
8a20: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
8a30: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
8a40: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
8a50: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
8a60: 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74  ..**.** Yet anot
8a70: 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69  her problem:  Li
8a80: 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f  nuxThreads do no
8a90: 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
8aa0: 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a   posix locks..**
8ab0: 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76  .** Many older v
8ac0: 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78  ersions of linux
8ad0: 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68   use the LinuxTh
8ae0: 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68  reads library wh
8af0: 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f  ich is.** not po
8b00: 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20  six compliant.  
8b10: 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61  Under LinuxThrea
8b20: 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  ds, a lock creat
8b30: 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20  ed by thread.** 
8b40: 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  A cannot be modi
8b50: 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64  fied or overridd
8b60: 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  en by a differen
8b70: 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  t thread B..** O
8b80: 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e  nly thread A can
8b90: 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b   modify the lock
8ba0: 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76  .  Locking behav
8bb0: 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a  ior is correct.*
8bc0: 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74  * if the appliat
8bd0: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77  ion uses the new
8be0: 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20  er Native Posix 
8bf0: 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28  Thread Library (
8c00: 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75  NPTL).** on linu
8c10: 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20  x - with NPTL a 
8c20: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
8c30: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
8c40: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69  rride locks.** i
8c50: 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74  n thread B.  But
8c60: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
8c70: 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   to know at comp
8c80: 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a  ile-time which.*
8c90: 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72  * threading libr
8ca0: 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ary is being use
8cb0: 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  d.  So there is 
8cc0: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
8cd0: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t.** compile-tim
8ce0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
8cf0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
8d00: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20  erride locks on 
8d10: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65  thread B..** One
8d20: 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e   has to do a run
8d30: 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64  -time check to d
8d40: 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61  iscover the beha
8d50: 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63  vior of the.** c
8d60: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a  urrent process..
8d70: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
8d80: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e  d to support Lin
8d90: 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20  uxThreads.  But 
8da0: 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75  support for Linu
8db0: 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20  xThreads.** was 
8dc0: 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e  dropped beginnin
8dd0: 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33  g with version 3
8de0: 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69  .7.0.  SQLite wi
8df0: 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69  ll still work wi
8e00: 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61  th.** LinuxThrea
8e10: 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74  ds provided that
8e20: 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (1) there is no
8e30: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
8e40: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65  onnection .** pe
8e50: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
8e60: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
8e70: 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61  ess and (2) data
8e80: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
8e90: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20  .** do not move 
8ea0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a  across threads..
8eb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
8ec0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
8ed0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
8ee0: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
8ef0: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
8f00: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
8f10: 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  r unixInodeInfo 
8f20: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63  object..*/.struc
8f30: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
8f40: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f60: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
8f70: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
8f80: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
8f90: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
8fa0: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
8fb0: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
8fc0: 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e  #else.  ino_t in
8fd0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
8fe0: 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d      /* Inode num
8ff0: 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ber */.#endif.};
9000: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
9010: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
9020: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
9030: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
9040: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
9050: 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75  de.  Or, on Linu
9060: 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20  xThreads, there 
9070: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  is one of these 
9080: 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a  structures for.*
9090: 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65  * each inode ope
90a0: 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65  ned by each thre
90b0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67  ad..**.** A sing
90c0: 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76  le inode can hav
90d0: 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20  e multiple file 
90e0: 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20  descriptors, so 
90f0: 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a  each unixFile.**
9100: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
9110: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
9120: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
9130: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
9140: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
9150: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
9160: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e  the number of un
9170: 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20  ixFile pointing 
9180: 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  to it..*/.struct
9190: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b   unixInodeInfo {
91a0: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
91b0: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
91c0: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
91d0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   key */.  int nS
91e0: 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 20  hared;          
91f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9200: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
9210: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e  cks held */.  un
9220: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
9230: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a  eLock;        /*
9240: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
9250: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
9260: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73  CK etc. */.  uns
9270: 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63  igned char bProc
9280: 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  essLock;     /* 
9290: 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f  An exclusive pro
92a0: 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c  cess lock is hel
92b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  d */.  int nRef;
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
92e0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
92f0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
9300: 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
9310: 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
9320: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
9330: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
9340: 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20  with this inode 
9350: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20  */.  int nLock; 
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9380: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69  f outstanding fi
9390: 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e  le locks */.  Un
93a0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
93b0: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  sed;          /*
93c0: 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   Unused file des
93d0: 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73  criptors to clos
93e0: 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
93f0: 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20  Info *pNext;    
9400: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
9410: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
9420: 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  nfo objects */. 
9430: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9440: 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  pPrev;          
9450: 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62   /*    .... doub
9460: 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66  ly linked */.#if
9470: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
9480: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75  OCKING_STYLE.  u
9490: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
94a0: 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f  g sharedByte;  /
94b0: 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61  * for AFP simula
94c0: 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ted shared lock 
94d0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
94e0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
94f0: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
9500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
9510: 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68  med POSIX semaph
9520: 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  ore */.  char aS
9530: 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  emName[MAX_PATHN
9540: 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65  AME+2];  /* Name
9550: 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f   of that semapho
9560: 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  re */.#endif.};.
9570: 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f  ./*.** A lists o
9580: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
9590: 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a  nfo objects..*/.
95a0: 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65  static unixInode
95b0: 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20  Info *inodeList 
95c0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  = 0;../*.**.** T
95d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75  his function - u
95e0: 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c  nixLogError_x(),
95f0: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61   is only ever ca
9600: 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63  lled via the mac
9610: 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72  ro.** unixLogErr
9620: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  or()..**.** It i
9630: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
9640: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
9650: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
9660: 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20  n and errno has 
9670: 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20  been.** set. It 
9680: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
9690: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
96a0: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
96b0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
96c0: 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c  of.** errno and,
96d0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
96e0: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
96f0: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
9700: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a   strerror() or.*
9710: 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  * strerror_r()..
9720: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
9730: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
9740: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
9750: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
9760: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
9770: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
9780: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
9790: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
97a0: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
97b0: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
97c0: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
97d0: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
97e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
97f0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
9800: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67  t.** failed (e.g
9810: 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65  . "unlink", "ope
9820: 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f  n") and the asso
9830: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
9840: 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61  em path,.** if a
9850: 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75  ny..*/.#define u
9860: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  nixLogError(a,b,
9870: 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  c)     unixLogEr
9880: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
9890: 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63  __LINE__).static
98a0: 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f   int unixLogErro
98b0: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
98c0: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
98d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
98e0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
98f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9900: 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  *zFunc,         
9910: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
9920: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
9930: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e   failed */.  con
9940: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9960: 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69  File path associ
9970: 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20  ated with error 
9980: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20  */.  int iLine  
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c       /* Source l
99b0: 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ine number where
99c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
99d0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
99e0: 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rr;             
99f0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61          /* Messa
9a00: 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  ge from strerror
9a10: 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  () or equivalent
9a20: 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f   */.  int iErrno
9a30: 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20   = errno;       
9a40: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73        /* Saved s
9a50: 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d  yscall error num
9a60: 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ber */..  /* If 
9a70: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68  this is not a th
9a80: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28  readsafe build (
9a90: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
9aa0: 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a  E==0), then use.
9ab0: 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f    ** the strerro
9ac0: 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
9ad0: 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e  obtain the human
9ae0: 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20  -readable error 
9af0: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75  message.  ** equ
9b00: 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f  ivalent to errno
9b10: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
9b20: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20   strerror_r().. 
9b30: 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f   */ .#if SQLITE_
9b40: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
9b50: 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52  fined(HAVE_STRER
9b60: 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45  ROR_R).  char aE
9b70: 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74  rr[80];.  memset
9b80: 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (aErr, 0, sizeof
9b90: 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20  (aErr));.  zErr 
9ba0: 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66  = aErr;..  /* If
9bb0: 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52   STRERROR_R_CHAR
9bc0: 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63  _P (set by autoc
9bd0: 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20  onf scripts) or 
9be0: 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66  __USE_GNU is def
9bf0: 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d  ined,.  ** assum
9c00: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
9c10: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 47  m provides the G
9c20: 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74  NU version of st
9c30: 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a  rerror_r() that.
9c40: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
9c50: 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
9c60: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
9c70: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
9c80: 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20   That pointer . 
9c90: 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   ** may point to
9ca0: 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d   aErr[], or it m
9cb0: 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ay point to some
9cc0: 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20   static storage 
9cd0: 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a  somewhere. .  **
9ce0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
9cf0: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
9d00: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
9d10: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66  POSIX version of
9d20: 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f   .  ** strerror_
9d30: 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79  r(), which alway
9d40: 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f  s writes an erro
9d50: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61  r message into a
9d60: 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Err[]..  **.  **
9d70: 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63   If the code inc
9d80: 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73  orrectly assumes
9d90: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
9da0: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68  POSIX version th
9db0: 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c  at is.  ** avail
9dc0: 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20  able, the error 
9dd0: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74  message will oft
9de0: 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  en be an empty s
9df0: 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a  tring. Not a.  *
9e00: 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20  * huge problem. 
9e10: 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63  Incorrectly conc
9e20: 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20  luding that the 
9e30: 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61  GNU version is a
9e40: 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63  vailable .  ** c
9e50: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73  ould lead to a s
9e60: 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a  egfault though..
9e70: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
9e80: 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52  (STRERROR_R_CHAR
9e90: 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  _P) || defined(_
9ea0: 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72  _USE_GNU).  zErr
9eb0: 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74   = .# endif.  st
9ec0: 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c  rerror_r(iErrno,
9ed0: 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45   aErr, sizeof(aE
9ee0: 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53  rr)-1);..#elif S
9ef0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
9f00: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
9f10: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
9f20: 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72  , but strerror_r
9f30: 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  () is not availa
9f40: 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  ble. */.  zErr =
9f50: 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20   "";.#else.  /* 
9f60: 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62  Non-threadsafe b
9f70: 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72  uild, use strerr
9f80: 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  or(). */.  zErr 
9f90: 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e  = strerror(iErrn
9fa0: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
9fb0: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
9fc0: 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74  th = "";.  sqlit
9fd0: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
9fe0: 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63        "os_unix.c
9ff0: 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29  :%d: (%d) %s(%s)
a000: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
a010: 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75  ine, iErrno, zFu
a020: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a  nc, zPath, zErr.
a030: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
a040: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
a050: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   Close a file de
a060: 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
a070: 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63  We assume that c
a080: 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c  lose() almost al
a090: 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63  ways works, sinc
a0a0: 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20  e it is only in 
a0b0: 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61  a.** very sick a
a0c0: 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e  pplication or on
a0d0: 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61   a very sick pla
a0e0: 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69  tform that it mi
a0f0: 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20  ght fail..** If 
a100: 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69  it does fail, si
a110: 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69  mply leak the fi
a120: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62  le descriptor, b
a130: 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a  ut do log the.**
a140: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   error..**.** No
a150: 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  te that it is no
a160: 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20  t safe to retry 
a170: 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49  close() after EI
a180: 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  NTR since the.**
a190: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a1a0: 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65   might have alre
a1b0: 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20  ady been reused 
a1c0: 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  by another threa
a1d0: 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27  d..** So we don'
a1e0: 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65  t even try to re
a1f0: 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49  cover from an EI
a200: 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74  NTR.  Just log t
a210: 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20  he error.** and 
a220: 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  move on..*/.stat
a230: 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63  ic void robust_c
a240: 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  lose(unixFile *p
a250: 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74  File, int h, int
a260: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20   lineno){.  if( 
a270: 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20  osClose(h) ){.  
a280: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
a290: 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52  Line(SQLITE_IOER
a2a0: 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22  R_CLOSE, "close"
a2b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a2c0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f           pFile ?
a2d0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20   pFile->zPath : 
a2e0: 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a  0, lineno);.  }.
a2f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
a300: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a310: 6f 2e 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61  o.  Do this in a
a320: 20 73 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74   subroutine as t
a330: 68 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  hat provides.** 
a340: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
a350: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
a360: 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
a370: 63 20 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74  c void storeLast
a380: 45 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a  Errno(unixFile *
a390: 70 46 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72  pFile, int error
a3a0: 29 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ){.  pFile->last
a3b0: 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d  Errno = error;.}
a3c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
a3d0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
a3e0: 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e  rs accumuated in
a3f0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
a400: 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  fo->pUnused list
a410: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
a420: 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64  d closePendingFd
a430: 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
a440: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
a450: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
a460: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
a470: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a  nixUnusedFd *p;.
a480: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
a490: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
a4a0: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
a4b0: 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
a4c0: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
a4d0: 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  t;.    robust_cl
a4e0: 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64  ose(pFile, p->fd
a4f0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
a500: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
a510: 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e  ;.  }.  pInode->
a520: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
a530: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
a540: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
a550: 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73  ructure previous
a560: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
a570: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
a580: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
a590: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
a5a0: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
a5b0: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
a5c0: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
a5d0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
a5e0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
a5f0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
a600: 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46  eInodeInfo(unixF
a610: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
a620: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
a630: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
a640: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
a650: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
a660: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
a670: 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70  pInode) ){.    p
a680: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Inode->nRef--;. 
a690: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
a6a0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
a6b0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
a6c0: 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20  pShmNode==0 );. 
a6d0: 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
a6e0: 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
a6f0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
a700: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
a710: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
a720: 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49  pPrev->pNext==pI
a730: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
a740: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
a750: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
a760: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
a770: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
a780: 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49  t( inodeList==pI
a790: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
a7a0: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f  inodeList = pIno
a7b0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
a7c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e   }.      if( pIn
a7d0: 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ode->pNext ){.  
a7e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
a7f0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
a800: 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  ev==pInode );.  
a810: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e        pInode->pN
a820: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ext->pPrev = pIn
a830: 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ode->pPrev;.    
a840: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a850: 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a  3_free(pInode);.
a860: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
a870: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
a880: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
a890: 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  te the unixInode
a8a0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
a8b0: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
a8c0: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
a8d0: 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  or.  Create a ne
a8e0: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
a8f0: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
a900: 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62  rn value might b
a910: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
a920: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
a930: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  rs..**.** The mu
a940: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
a950: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
a960: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
a970: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
a980: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
a990: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
a9a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70  .** Return an ap
a9b0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
a9c0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
a9d0: 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  int findInodeInf
a9e0: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
a9f0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
aa00: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
aa10: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
aa20: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
aa30: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
aa40: 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20  fo **ppInode    
aa50: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
aa60: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
aa70: 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29  object here */.)
aa80: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c     /* System cal
aab0: 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  l return code */
aac0: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
aaf0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69  scriptor for pFi
ab00: 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  le */.  struct u
ab10: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
ab20: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
ab30: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
ab40: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20  xInodeInfo */.  
ab50: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
ab60: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  buf;           /
ab70: 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
ab80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
ab90: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
aba0: 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20  *pInode = 0;    
abb0: 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e   /* Candidate un
abc0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
abd0: 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ct */..  assert(
abe0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
abf0: 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f   );..  /* Get lo
ac00: 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74  w-level informat
ac10: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69  ion about the fi
ac20: 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75  le that we can u
ac30: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61  sed to.  ** crea
ac40: 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65  te a unique name
ac50: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20   for the file.. 
ac60: 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65   */.  fd = pFile
ac70: 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  ->h;.  rc = osFs
ac80: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
ac90: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
aca0: 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
acb0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
acc0: 6f 29 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52  o);.#ifdef EOVER
acd0: 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69  FLOW.    if( pFi
ace0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
acf0: 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72  OVERFLOW ) retur
ad00: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a  n SQLITE_NOLFS;.
ad10: 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
ad20: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
ad30: 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50    }..#ifdef __AP
ad40: 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53  PLE__.  /* On OS
ad50: 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66   X on an msdos f
ad60: 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69  ilesystem, the i
ad70: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72  node number is r
ad80: 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63  eported.  ** inc
ad90: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72  orrectly for zer
ada0: 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53  o-size files.  S
adb0: 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e  ee ticket #3260.
adc0: 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61    To work.  ** a
add0: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
ade0: 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20  em (we consider 
adf0: 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58  it a bug in OS X
ae00: 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20  , not SQLite).  
ae10: 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63  ** we always inc
ae20: 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73  rease the file s
ae30: 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74  ize to 1 by writ
ae40: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
ae50: 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  e.  ** prior to 
ae60: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e  accessing the in
ae70: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ode number.  The
ae80: 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65   one byte writte
ae90: 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43  n is.  ** an ASC
aea0: 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72  II 'S' character
aeb0: 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70   which also happ
aec0: 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69  ens to be the fi
aed0: 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e  rst byte.  ** in
aee0: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65   the header of e
aef0: 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61  very SQLite data
af00: 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77  base.  In this w
af10: 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a  ay, if there.  *
af20: 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  * is a race cond
af30: 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ition such that 
af40: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
af50: 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  as already popul
af60: 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69  ated.  ** the fi
af70: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
af80: 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d  database, no dam
af90: 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  age is done..  *
afa0: 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e  /.  if( statbuf.
afb0: 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70  st_size==0 && (p
afc0: 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20  File->fsFlags & 
afd0: 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
afe0: 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20  S_MSDOS)!=0 ){. 
aff0: 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72     do{ rc = osWr
b000: 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b  ite(fd, "S", 1);
b010: 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
b020: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
b030: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29  .    if( rc!=1 )
b040: 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
b050: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
b060: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rno);.      retu
b070: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
b080: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
b090: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
b0a0: 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
b0b0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  c!=0 ){.      st
b0c0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
b0d0: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
b0e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b0f0: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
b100: 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65  .#endif..  memse
b110: 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69  t(&fileId, 0, si
b120: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
b130: 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74   fileId.dev = st
b140: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69  atbuf.st_dev;.#i
b150: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66  f OS_VXWORKS.  f
b160: 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c  ileId.pId = pFil
b170: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
b180: 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61  fileId.ino = sta
b190: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e  tbuf.st_ino;.#en
b1a0: 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69  dif.  pInode = i
b1b0: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  nodeList;.  whil
b1c0: 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d  e( pInode && mem
b1d0: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49  cmp(&fileId, &pI
b1e0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69  node->fileId, si
b1f0: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b  zeof(fileId)) ){
b200: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49  .    pInode = pI
b210: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  node->pNext;.  }
b220: 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30  .  if( pInode==0
b230: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
b240: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
b250: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
b260: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
b270: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
b280: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
b290: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
b2a0: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
b2b0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
b2c0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
b2d0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
b2e0: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
b2f0: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
b300: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
b310: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
b320: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
b330: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
b340: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
b350: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
b360: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
b370: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
b380: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
b390: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
b3a0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
b3b0: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
b3c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b3d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
b3e0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69  turn TRUE if pFi
b3f0: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61  le has been rena
b400: 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20  med or unlinked 
b410: 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72  since it was fir
b420: 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74  st opened..*/.st
b430: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73  atic int fileHas
b440: 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a  Moved(unixFile *
b450: 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56  pFile){.#if OS_V
b460: 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
b470: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
b480: 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d   && pFile->pId!=
b490: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66  pFile->pInode->f
b4a0: 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65  ileId.pId;.#else
b4b0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
b4c0: 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  uf;.  return pFi
b4d0: 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26  le->pInode!=0 &&
b4e0: 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70  .      (osStat(p
b4f0: 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75  File->zPath, &bu
b500: 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f  f)!=0 || buf.st_
b510: 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  ino!=pFile->pIno
b520: 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b  de->fileId.ino);
b530: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
b540: 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69  * Check a unixFi
b550: 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74  le that is a dat
b560: 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74  abase.  Verify t
b570: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
b580: 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73  .** (1) There is
b590: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72   exactly one har
b5a0: 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69  d link on the fi
b5b0: 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69  le.** (2) The fi
b5c0: 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62  le is not a symb
b5d0: 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29  olic link.** (3)
b5e0: 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f   The file has no
b5f0: 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f  t been renamed o
b600: 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a  r unlinked.**.**
b610: 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c   Issue sqlite3_l
b620: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b630: 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20  G,...) messages 
b640: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e  if anything is n
b650: 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  ot right..*/.sta
b660: 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44  tic void verifyD
b670: 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  bFile(unixFile *
b680: 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74  pFile){.  struct
b690: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74   stat buf;.  int
b6a0: 20 72 63 3b 0a 20 20 69 66 28 20 70 46 69 6c 65   rc;.  if( pFile
b6b0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
b6c0: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 29 7b  IXFILE_WARNED ){
b6d0: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d  .    /* One or m
b6e0: 6f 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ore of the follo
b6f0: 77 69 6e 67 20 77 61 72 6e 69 6e 67 73 20 68 61  wing warnings ha
b700: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
b710: 69 73 73 75 65 64 2e 20 20 44 6f 20 6e 6f 74 0a  issued.  Do not.
b720: 20 20 20 20 2a 2a 20 72 65 70 65 61 74 20 74 68      ** repeat th
b730: 65 6d 20 73 6f 20 61 73 20 6e 6f 74 20 74 6f 20  em so as not to 
b740: 63 6c 75 74 74 65 72 20 74 68 65 20 65 72 72 6f  clutter the erro
b750: 72 20 6c 6f 67 20 2a 2f 0a 20 20 20 20 72 65 74  r log */.    ret
b760: 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
b770: 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
b780: 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72  , &buf);.  if( r
b790: 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c!=0 ){.    sqli
b7a0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b7b0: 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20  ARNING, "cannot 
b7c0: 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73  fstat db file %s
b7d0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b7e0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  ;.    pFile->ctr
b7f0: 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
b800: 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72  LE_WARNED;.    r
b810: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
b820: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30   buf.st_nlink==0
b830: 20 26 26 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c   && (pFile->ctrl
b840: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
b850: 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  _DELETE)==0 ){. 
b860: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
b870: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
b880: 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68  file unlinked wh
b890: 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70  ile open: %s", p
b8a0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
b8b0: 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
b8c0: 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57  gs |= UNIXFILE_W
b8d0: 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72  ARNED;.    retur
b8e0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66  n;.  }.  if( buf
b8f0: 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20  .st_nlink>1 ){. 
b900: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
b910: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
b920: 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74  multiple links t
b930: 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69  o file: %s", pFi
b940: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
b950: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
b960: 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52   |= UNIXFILE_WAR
b970: 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  NED;.    return;
b980: 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 48  .  }.  if( fileH
b990: 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20 29  asMoved(pFile) )
b9a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b9b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b9c0: 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20  , "file renamed 
b9d0: 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c  while open: %s",
b9e0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
b9f0: 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
ba00: 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
ba10: 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74  _WARNED;.    ret
ba20: 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  urn;.  }.}.../*.
ba30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ba40: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
ba50: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
ba60: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
ba70: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
ba80: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
ba90: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
baa0: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
bab0: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
bac0: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
bad0: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
bae0: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
baf0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
bb00: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
bb10: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
bb20: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
bb30: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
bb40: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
bb50: 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
bb60: 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52  c int unixCheckR
bb70: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
bb80: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
bb90: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
bba0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bbb0: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
bbc0: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
bbd0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
bbe0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
bbf0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
bc00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
bc10: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
bc20: 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
bc30: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e  t( pFile );.  un
bc40: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
bc50: 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
bc60: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
bc70: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
bc80: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
bc90: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
bca0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
bcb0: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
bcc0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
bcd0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
bce0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
bcf0: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
bd00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65  ;.  }..  /* Othe
bd10: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
bd20: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
bd30: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23  holds it..  */.#
bd40: 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  ifndef __DJGPP__
bd50: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
bd60: 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f   && !pFile->pIno
bd70: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
bd80: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
bd90: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c  lock lock;.    l
bda0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
bdb0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
bdc0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
bdd0: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c  RVED_BYTE;.    l
bde0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
bdf0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
be00: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66   F_WRLCK;.    if
be10: 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  ( osFcntl(pFile-
be20: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
be30: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ck) ){.      rc 
be40: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
be50: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
be60: 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
be70: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
be80: 72 6e 6f 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rno);.    } else
be90: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
bea0: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
beb0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
bec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
bed0: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
bee0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
bef0: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
bf00: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
bf10: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
bf20: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
bf30: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
bf40: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
bf50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
bf60: 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73  tempt to set a s
bf70: 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68  ystem-lock on th
bf80: 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54  e file pFile.  T
bf90: 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64  he lock is .** d
bfa0: 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63  escribed by pLoc
bfb0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
bfc0: 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  pFile was opened
bfd0: 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d   read/write from
bfe0: 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e   unix-excl, then
bff0: 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a   the only lock.*
c000: 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20  * ever obtained 
c010: 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  is an exclusive 
c020: 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20  lock, and it is 
c030: 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79  obtained exactly
c040: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72   once.** the fir
c050: 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b  st time any lock
c060: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20   is attempted.  
c070: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73  All subsequent s
c080: 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  ystem locking.**
c090: 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f   operations beco
c0a0: 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b  me no-ops.  Lock
c0b0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73  ing operations s
c0c0: 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65  till happen inte
c0d0: 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72  rnally,.** in or
c0e0: 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  der to coordinat
c0f0: 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e  e access between
c100: 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61   separate databa
c110: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
c120: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72  * within this pr
c130: 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f  ocess, but all o
c140: 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65  f that is handle
c150: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20  d in memory and 
c160: 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  the.** operating
c170: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
c180: 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a   participate..**
c190: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c1a0: 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f  n is a pass-thro
c1b0: 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53  ugh to fcntl(F_S
c1c0: 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69  ETLK) if pFile i
c1d0: 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56  s using.** any V
c1e0: 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75  FS other than "u
c1f0: 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20  nix-excl" or if 
c200: 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  pFile is opened 
c210: 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a  on "unix-excl".*
c220: 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e  * and is read-on
c230: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ly..**.** Zero i
c240: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
c250: 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73  e call completes
c260: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f   successfully, o
c270: 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a  r -1 if a call.*
c280: 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69  * to fcntl() fai
c290: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
c2a0: 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61  , errno is set a
c2b0: 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79  ppropriately (by
c2c0: 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74   fcntl())..*/.st
c2d0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
c2e0: 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  eLock(unixFile *
c2f0: 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c  pFile, struct fl
c300: 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69  ock *pLock){.  i
c310: 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f  nt rc;.  unixIno
c320: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
c330: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
c340: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
c350: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61  texHeld() );.  a
c360: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30  ssert( pInode!=0
c370: 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c   );.  if( ((pFil
c380: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
c390: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30  NIXFILE_EXCL)!=0
c3a0: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f   || pInode->bPro
c3b0: 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20  cessLock).   && 
c3c0: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
c3d0: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44  gs & UNIXFILE_RD
c3e0: 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ONLY)==0).  ){. 
c3f0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
c400: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
c410: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
c420: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
c430: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c440: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
c450: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
c460: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
c470: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c480: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
c490: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
c4a0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c4b0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
c4c0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
c4d0: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
c4e0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
c4f0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
c500: 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75   if( rc<0 ) retu
c510: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e  rn rc;.      pIn
c520: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
c530: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  k = 1;.      pIn
c540: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
c550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
c560: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
c570: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f  else{.    rc = o
c580: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
c590: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
c5a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c5b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
c5c0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
c5d0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
c5e0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
c5f0: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
c600: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
c610: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
c620: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
c630: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
c640: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
c650: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
c660: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
c670: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
c680: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
c690: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
c6a0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
c6b0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
c6c0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
c6d0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
c6e0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
c6f0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
c700: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
c710: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
c720: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
c730: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
c740: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
c750: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
c760: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
c770: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
c780: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
c790: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
c7a0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
c7b0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
c7c0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
c7d0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
c7e0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
c7f0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
c800: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
c810: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
c820: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
c830: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
c840: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c850: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
c860: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
c870: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c880: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
c890: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
c8a0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
c8b0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
c8c0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
c8d0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
c8e0: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
c8f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c900: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
c910: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
c920: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
c930: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c940: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
c950: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
c960: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
c970: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
c980: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
c990: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
c9a0: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
c9b0: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
c9c0: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
c9d0: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
c9e0: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
c9f0: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
ca00: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
ca10: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
ca20: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
ca30: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
ca40: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
ca50: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77  ompatible with w
ca60: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73  indows systems s
ca70: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
ca80: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
ca90: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
caa0: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
cab0: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
cac0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
cad0: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
cae0: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
caf0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
cb00: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
cb10: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
cb20: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
cb30: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
cb40: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
cb50: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
cb60: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
cb70: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
cb80: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
cb90: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
cba0: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
cbb0: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
cbc0: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
cbd0: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
cbe0: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
cbf0: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
cc00: 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d  essful, a random
cc10: 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27   byte from the '
cc20: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
cc30: 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
cc40: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c  locked and the l
cc50: 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ock on the 'pend
cc60: 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73  ing byte' releas
cc70: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ed..  **.  ** A 
cc80: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
cc90: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
cca0: 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  ED lock after it
ccb0: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f   has a SHARED lo
ccc0: 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52  ck..  ** A RESER
ccd0: 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  VED lock is impl
cce0: 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62  emented by grabb
ccf0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
cd00: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65   on the.  ** 're
cd10: 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20  served byte'. . 
cd20: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
cd30: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
cd40: 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  in a PENDING loc
cd50: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f  k after it has o
cd60: 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53  btained a.  ** S
cd70: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45  HARED lock. A PE
cd80: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d  NDING lock is im
cd90: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
cda0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
cdb0: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
cdc0: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20  'pending byte'. 
cdd0: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
cde0: 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20  t no new SHARED 
cdf0: 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a  locks can be.  *
ce00: 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20  * obtained, but 
ce10: 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20  existing SHARED 
ce20: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65  locks are allowe
ce30: 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20  d to persist. A 
ce40: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65  process.  ** doe
ce50: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62  s not have to ob
ce60: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
ce70: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20  lock on the way 
ce80: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
ce90: 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  k..  ** This pro
cea0: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79  perty is used by
ceb0: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66   the algorithm f
cec0: 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
ced0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  a journal file. 
cee0: 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73   ** after a cras
cef0: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  h..  **.  ** An 
cf00: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
cf10: 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61  obtained after a
cf20: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
cf30: 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69   held, is.  ** i
cf40: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
cf50: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
cf60: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69  lock on the enti
cf70: 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  re 'shared byte.
cf80: 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e    ** range'. Sin
cf90: 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  ce all other loc
cfa0: 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ks require a rea
cfb0: 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  d-lock on one of
cfc0: 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20   the bytes.  ** 
cfd0: 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67  within this rang
cfe0: 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
cff0: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f  that no other lo
d000: 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  cks are held on 
d010: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
d020: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
d030: 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c  e reason a singl
d040: 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65  e byte cannot be
d050: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
d060: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
d070: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
d080: 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69   that some versi
d090: 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64  ons of windows d
d0a0: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65  o not support re
d0b0: 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a  ad-locks. By.  *
d0c0: 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64  * locking a rand
d0d0: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72  om byte from a r
d0e0: 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  ange, concurrent
d0f0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61   SHARED locks ma
d100: 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65  y exist.  ** eve
d110: 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n if the locking
d120: 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20   primitive used 
d130: 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74  is always a writ
d140: 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  e-lock..  */.  i
d150: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d160: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
d170: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
d180: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
d190: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
d1a0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
d1b0: 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f  ck;.  int tErrno
d1c0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
d1d0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
d1e0: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
d1f0: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
d200: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
d210: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
d220: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
d230: 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c  FileLock), azFil
d240: 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69  eLock(pFile->eFi
d250: 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61  leLock),.      a
d260: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
d270: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
d280: 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ck), pFile->pIno
d290: 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
d2a0: 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29     osGetpid(0)))
d2b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
d2c0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
d2d0: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
d2e0: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
d2f0: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
d300: 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
d310: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
d320: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
d330: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
d340: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
d350: 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
d360: 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
d370: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
d380: 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
d390: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
d3a0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
d3b0: 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
d3c0: 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  ) (unix)\n", pFi
d3d0: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
d3e0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
d3f0: 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
d400: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d410: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
d420: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
d430: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
d440: 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29  rrect..  **  (1)
d450: 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
d460: 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
d470: 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
d480: 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
d490: 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
d4a0: 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
d4b0: 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
d4c0: 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
d4d0: 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
d4e0: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
d4f0: 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
d500: 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
d510: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
d520: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
d530: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
d540: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
d550: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
d560: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
d570: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
d580: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
d590: 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
d5a0: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
d5b0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d5c0: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
d5d0: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
d5e0: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
d5f0: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
d600: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
d610: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
d620: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
d630: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
d640: 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
d650: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
d660: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
d670: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
d680: 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
d690: 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
d6a0: 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
d6b0: 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
d6c0: 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
d6d0: 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
d6e0: 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
d6f0: 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
d700: 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
d710: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
d720: 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
d730: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
d740: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  )).  ){.    rc =
d750: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
d760: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
d770: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
d780: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
d790: 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
d7a0: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
d7b0: 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
d7c0: 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
d7d0: 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
d7e0: 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
d7f0: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
d800: 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
d810: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
d820: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
d830: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
d840: 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e  K && .      (pIn
d850: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
d860: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
d870: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
d880: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
d890: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d8a0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d8b0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
d8c0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
d8d0: 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
d8e0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
d8f0: 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
d900: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
d910: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
d920: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
d930: 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
d940: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
d950: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
d960: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45  .  }...  /* A PE
d970: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
d980: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
d990: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
d9a0: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
d9b0: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
d9c0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
d9d0: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
d9e0: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
d9f0: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
da00: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
da10: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
da20: 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  ;.  lock.l_whenc
da30: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
da40: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
da50: 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
da60: 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
da70: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
da80: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
da90: 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
daa0: 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ).  ){.    lock.
dab0: 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c  l_type = (eFileL
dac0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
dad0: 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b  ?F_RDLCK:F_WRLCK
dae0: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  );.    lock.l_st
daf0: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
db00: 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  TE;.    if( unix
db10: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
db20: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
db30: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
db40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
db50: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
db60: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
db70: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
db80: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
db90: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
dba0: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
dbb0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
dbc0: 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
dbd0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
dbe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
dbf0: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
dc00: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
dc10: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
dc20: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
dc30: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
dc40: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
dc50: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
dc60: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
dc70: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
dc80: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
dc90: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
dca0: 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  Shared==0 );.   
dcb0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
dcc0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
dcd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
dce0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
dcf0: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
dd00: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
dd10: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
dd20: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
dd30: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
dd40: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
dd50: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
dd60: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
dd70: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
dd80: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
dd90: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
dda0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
ddb0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
ddc0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  ERR_LOCK);.    }
ddd0: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  ..    /* Drop th
dde0: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
ddf0: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
de00: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
de10: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
de20: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
de30: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
de40: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
de50: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
de60: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
de70: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
de80: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
de90: 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77  s could happen w
dea0: 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f  ith a network mo
deb0: 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72  unt */.      tEr
dec0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
ded0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
dee0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
def0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20    }..    if( rc 
df00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ){.      if( rc!
df10: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
df20: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
df30: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
df40: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rrno);.      }. 
df50: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
df60: 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
df70: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
df80: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
df90: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
dfa0: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
dfb0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
dfc0: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
dfd0: 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
dfe0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
dff0: 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
e000: 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
e010: 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
e020: 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
e030: 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
e040: 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
e050: 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f  .    ** same pro
e060: 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
e070: 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
e080: 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
e090: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
e0a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
e0b0: 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
e0c0: 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
e0d0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
e0e0: 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
e0f0: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
e100: 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
e110: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
e120: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
e130: 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
e140: 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
e150: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
e160: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
e170: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20  pe = F_WRLCK;.. 
e180: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
e190: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
e1a0: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
e1b0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
e1c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c   );.    if( eFil
e1d0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
e1e0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f  LOCK ){.      lo
e1f0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
e200: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
e210: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
e220: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
e230: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e240: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
e250: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
e260: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
e270: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
e280: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e290: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
e2a0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
e2b0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
e2c0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
e2d0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
e2e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
e2f0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
e300: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
e310: 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
e320: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
e330: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
e340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23  .    }.  }.  ..#
e350: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
e360: 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  UG.  /* Set up t
e370: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63  he transaction-c
e380: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68  ounter change ch
e390: 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65  ecking flags whe
e3a0: 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f  n.  ** transitio
e3b0: 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52  ning from a SHAR
e3c0: 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44  ED to a RESERVED
e3d0: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e   lock.  The chan
e3e0: 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41  ge.  ** from SHA
e3f0: 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20  RED to RESERVED 
e400: 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e  marks the beginn
e410: 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a  ing of a normal.
e420: 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61    ** write opera
e430: 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20  tion (not a hot 
e440: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
e450: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  )..  */.  if( rc
e460: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
e470: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
e480: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  ck<=SHARED_LOCK.
e490: 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d     && eFileLock=
e4a0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20  =RESERVED_LOCK. 
e4b0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74   ){.    pFile->t
e4c0: 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30  ransCntrChng = 0
e4d0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  ;.    pFile->dbU
e4e0: 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  pdate = 0;.    p
e4f0: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
e500: 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e  ite = 1;.  }.#en
e510: 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d  dif...  if( rc==
e520: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e530: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e540: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
e550: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
e560: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
e570: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
e580: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
e590: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
e5a0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
e5b0: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
e5c0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
e5d0: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
e5e0: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
e5f0: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
e600: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
e610: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
e620: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
e630: 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
e640: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
e650: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
e660: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
e670: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
e680: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e690: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
e6a0: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
e6b0: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
e6c0: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
e6d0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
e6e0: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
e6f0: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
e700: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
e710: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
e720: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
e730: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
e740: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
e750: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
e760: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
e770: 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  = pInode->pUnuse
e780: 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  d;.  pInode->pUn
e790: 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c  used = p;.  pFil
e7a0: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69  e->h = -1;.  pFi
e7b0: 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  le->pUnused = 0;
e7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
e7d0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e7e0: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
e7f0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
e800: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
e810: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
e820: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
e830: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
e840: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
e850: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
e860: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e870: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
e880: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
e890: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
e8a0: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
e8b0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
e8c0: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
e8d0: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
e8e0: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
e8f0: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
e900: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
e910: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
e920: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
e930: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
e940: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
e950: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
e960: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
e970: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
e980: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
e990: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
e9a0: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
e9b0: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
e9c0: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
e9d0: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
e9e0: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
e9f0: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
ea00: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
ea10: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
ea20: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
ea30: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
ea40: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
ea50: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ea60: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
ea70: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
ea80: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
ea90: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
eaa0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
eab0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
eac0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
ead0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
eae0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
eaf0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
eb00: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
eb10: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
eb20: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
eb30: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
eb40: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
eb50: 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ,.      pFile->e
eb60: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
eb70: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
eb80: 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
eb90: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
eba0: 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
ebb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
ebc0: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
ebd0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
ebe0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
ebf0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
ec00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ec10: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
ec20: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
ec30: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
ec40: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
ec50: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
ec60: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ec70: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
ec80: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
ec90: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
eca0: 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
ecb0: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66  FileLock );..#if
ecc0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
ecd0: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
ece0: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
ecf0: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
ed00: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
ed10: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
ed20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ed30: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
ed40: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
ed50: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
ed60: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
ed70: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
ed80: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
ed90: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
eda0: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
edb0: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
edc0: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
edd0: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
ede0: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
edf0: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
ee00: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
ee10: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
ee20: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
ee30: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
ee40: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
ee50: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
ee60: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
ee70: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
ee80: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
ee90: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
eea0: 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e    */.    pFile->
eeb0: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
eec0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
eed0: 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f  * downgrading to
eee0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
eef0: 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63  n NFS involves c
ef00: 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74  learing the writ
ef10: 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65  e lock.    ** be
ef20: 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e  fore establishin
ef30: 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d  g the readlock -
ef40: 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65   to avoid a race
ef50: 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f   condition we do
ef60: 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74  wngrade.    ** t
ef70: 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f  he lock in 2 blo
ef80: 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72  cks, so that par
ef90: 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77  t of the range w
efa0: 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62  ill be covered b
efb0: 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74  y a .    ** writ
efc0: 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65  e lock until the
efd0: 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64   rest is covered
efe0: 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a   by a read lock:
eff0: 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57  .    **  1:   [W
f000: 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a  WWWW].    **  2:
f010: 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a     [....W].    *
f020: 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a  *  3:   [RRRRW].
f030: 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52      **  4:   [RR
f040: 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RR.].    */.    
f050: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
f060: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69  HARED_LOCK ){.#i
f070: 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  f !defined(__APP
f080: 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45  LE__) || !SQLITE
f090: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
f0a0: 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69  STYLE.      (voi
f0b0: 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  d)handleNFSUnloc
f0c0: 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
f0d0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
f0e0: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==0 );.#endif.#i
f0f0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
f100: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
f110: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
f120: 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61  YLE.      if( ha
f130: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
f140: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
f150: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
f160: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
f170: 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
f180: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
f190: 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a      off_t divSiz
f1a0: 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20  e = SHARED_SIZE 
f1b0: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  - 1;.        .  
f1c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
f1d0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
f1e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f1f0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f200: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f210: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f220: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
f230: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
f240: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f250: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f260: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
f270: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
f280: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f290: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f2a0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
f2b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
f2c0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
f2d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
f2e0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
f2f0: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
f300: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f310: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
f320: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
f330: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
f340: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
f350: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
f360: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f370: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
f380: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f390: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
f3a0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
f3b0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
f3c0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f3d0: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
f3e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
f3f0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f400: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f410: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
f420: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
f430: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
f440: 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
f450: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
f460: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
f470: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f480: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
f490: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f4a0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
f4b0: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
f4c0: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
f4d0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f4e0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f4f0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
f500: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
f510: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
f520: 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b  D_FIRST+divSize;
f530: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f540: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
f550: 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  E-divSize;.     
f560: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
f570: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
f580: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
f590: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
f5a0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
f5b0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
f5c0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
f5d0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
f5e0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
f5f0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
f600: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
f610: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
f620: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
f630: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
f640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
f650: 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  lse.#endif /* de
f660: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
f670: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
f680: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
f690: 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
f6a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
f6b0: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
f6c0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f6d0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f6e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f6f0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
f700: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f710: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
f720: 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  E;.        if( u
f730: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f740: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
f750: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
f760: 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ory, the call to
f770: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20   unixFileLock() 
f780: 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61  cannot fail beca
f790: 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  use another.    
f7a0: 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
f7b0: 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69   is holding an i
f7c0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b  ncompatible lock
f7d0: 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68  . If it does, th
f7e0: 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
f7f0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
f800: 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  the other proces
f810: 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
f820: 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20  ng the locking. 
f830: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74           ** prot
f840: 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61  ocol. If this ha
f850: 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  ppens, return SQ
f860: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
f870: 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20  K. Returning.   
f880: 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
f890: 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66  _BUSY would conf
f8a0: 75 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61  use the upper la
f8b0: 79 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65  yer (in practice
f8c0: 20 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20   it causes .    
f8d0: 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65        ** an asse
f8e0: 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20  rt to fail). */ 
f8f0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f900: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
f910: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  OCK;.          s
f920: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
f930: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
f940: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
f950: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
f960: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f970: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
f980: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c  = F_UNLCK;.    l
f990: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f9a0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
f9b0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
f9c0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
f9d0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20  ck.l_len = 2L;  
f9e0: 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f  assert( PENDING_
f9f0: 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44  BYTE+1==RESERVED
fa00: 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28  _BYTE );.    if(
fa10: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
fa20: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
fa30: 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
fa40: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
fa50: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
fa60: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
fa70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
fa80: 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  CK;.      storeL
fa90: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
faa0: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f  errno);.      go
fab0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
fac0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
fad0: 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
fae0: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72  K ){.    /* Decr
faf0: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
fb00: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
fb10: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
fb20: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
fb30: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
fb40: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
fb50: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
fb60: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
fb70: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
fb80: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  k..    */.    pI
fb90: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
fba0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
fbb0: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
fbc0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
fbd0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
fbe0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
fbf0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
fc00: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
fc10: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
fc20: 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
fc30: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
fc40: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
fc50: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
fc60: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
fc70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fc80: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
fc90: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
fca0: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
fcb0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
fcc0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  rrno);.        p
fcd0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
fce0: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
fcf0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
fd00: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
fd10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
fd20: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
fd30: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63  the count of loc
fd40: 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  ks against this 
fd50: 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e  same file.  When
fd60: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e   the.    ** coun
fd70: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20  t reaches zero, 
fd80: 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20  close any other 
fd90: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
fda0: 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20   whose close.   
fdb0: 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64   ** was deferred
fdc0: 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73   because of outs
fdd0: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20  tanding locks.. 
fde0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
fdf0: 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
fe00: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
fe10: 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
fe20: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
fe30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f  ==0 ){.      clo
fe40: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
fe50: 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  le);.    }.  }..
fe60: 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e  end_unlock:.  un
fe70: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
fe80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fe90: 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
fea0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
feb0: 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
fec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
fed0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fee0: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
fef0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
ff00: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
ff10: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
ff20: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
ff30: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
ff40: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
ff50: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
ff60: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
ff70: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
ff80: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
ff90: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
ffa0: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
ffb0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
ffc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
ffd0: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
ffe0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
fff0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53  FileLock){.#if S
10000 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
10010 49 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20  IZE>0.  assert( 
10020 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
10030 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78  D_LOCK || ((unix
10040 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74  File *)id)->nFet
10050 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64  chOut==0 );.#end
10060 69 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  if.  return posi
10070 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
10080 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69  eLock, 0);.}..#i
10090 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
100a0 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
100b0 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  int unixMapfile(
100c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69  unixFile *pFd, i
100d0 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69  64 nByte);.stati
100e0 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70  c void unixUnmap
100f0 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
10100 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  Fd);.#endif../*.
10110 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10120 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
10130 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
10140 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
10150 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
10160 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
10170 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
10180 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
10190 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
101a0 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
101b0 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
101c0 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
101d0 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
101e0 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
101f0 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
10200 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
10210 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
10220 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10230 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
10240 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
10250 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
10260 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
10270 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
10280 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
10290 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
102a0 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
102b0 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
102c0 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
102d0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
102e0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20  ixFile*)id;.#if 
102f0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
10300 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d  SIZE>0.  unixUnm
10310 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23  apfile(pFile);.#
10320 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c  endif.  if( pFil
10330 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72  e->h>=0 ){.    r
10340 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
10350 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
10360 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c  INE__);.    pFil
10370 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  e->h = -1;.  }.#
10380 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
10390 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29  if( pFile->pId )
103a0 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  {.    if( pFile-
103b0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
103c0 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a  XFILE_DELETE ){.
103d0 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70        osUnlink(p
103e0 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
103f0 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
10400 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c  }.    vxworksRel
10410 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65  easeFileId(pFile
10420 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c  ->pId);.    pFil
10430 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a  e->pId = 0;.  }.
10440 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
10450 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45  LITE_UNLINK_AFTE
10460 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46  R_CLOSE.  if( pF
10470 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
10480 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
10490 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b   ){.    osUnlink
104a0 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  (pFile->zPath);.
104b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
104c0 28 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65  (*(char**)&pFile
104d0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46  ->zPath);.    pF
104e0 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a  ile->zPath = 0;.
104f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
10500 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
10510 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
10520 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ));.  OpenCounte
10530 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
10540 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e  _free(pFile->pUn
10550 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28  used);.  memset(
10560 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
10570 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72  (unixFile));.  r
10580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
105a0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
105b0 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
105c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
105d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
105e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
105f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10600 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76  ixFile *)id;.  v
10610 65 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c  erifyDbFile(pFil
10620 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  e);.  unixUnlock
10630 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
10640 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
10650 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c  );..  /* unixFil
10660 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61  e.pInode is alwa
10670 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f  ys valid here. O
10680 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66  therwise, a diff
10690 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a  erent close.  **
106a0 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e   routine (e.g. n
106b0 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f  olockClose()) wo
106c0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  uld be called in
106d0 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  stead..  */.  as
106e0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e  sert( pFile->pIn
106f0 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20  ode->nLock>0 || 
10700 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
10710 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
10720 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
10730 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26  File->pInode) &&
10740 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
10750 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20  nLock ){.    /* 
10760 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
10770 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
10780 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
10790 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
107a0 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62  ust.    ** yet b
107b0 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
107c0 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
107d0 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
107e0 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
107f0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
10800 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
10810 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
10820 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
10830 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20   closed .    ** 
10840 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
10850 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
10860 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e     */.    setPen
10870 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
10880 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64   }.  releaseInod
10890 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
108a0 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
108b0 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65  le(id);.  unixLe
108c0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
108d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
108f0 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
10900 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
10910 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
109f0 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
10a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
10a20 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
10a30 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
10a40 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
10a50 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
10a60 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
10a70 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
10a80 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
10a90 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
10aa0 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
10ab0 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
10ac0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
10ad0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
10ae0 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
10af0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
10b00 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
10b10 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
10b20 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
10b30 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
10b40 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
10b50 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
10b60 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
10b70 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
10b80 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
10b90 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
10ba0 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
10bb0 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
10bc0 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
10bd0 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
10be0 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
10bf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
10c00 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
10c10 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
10c20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
10c30 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
10c40 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
10c50 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
10c60 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
10c70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
10c80 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
10c90 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
10ca0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
10cb0 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
10cc0 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
10cd0 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
10ce0 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
10cf0 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
10d00 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
10d10 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
10d20 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
10d30 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
10d40 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10d50 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
10d60 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
10d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10d80 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
10d90 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
10da0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
10db0 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
10dc0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10dd0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
10de0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
10df0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
10e00 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
10e10 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10e20 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
10e30 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
10e40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
10e50 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
10e60 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
10e70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10e80 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
10e90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
10ea0 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
10eb0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
10ec0 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
10ed0 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
10ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ef0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
10f00 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
10f10 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
10f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
10ff0 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11020 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
11030 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
11040 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
11050 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65   existence of se
11060 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
11070 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64  iles (really a d
11080 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e  irectory) to con
11090 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
110a0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
110b0 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a  is works.** on j
110c0 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20  ust about every 
110d0 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
110e0 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
110f0 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
11100 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
11110 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
11120 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
11130 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
11140 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
11150 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
11160 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
11170 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
11180 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
11190 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
111a0 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
111b0 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
111c0 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
111d0 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
111e0 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
111f0 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
11200 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
11210 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
11220 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
11230 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
11240 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
11250 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
11260 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
11270 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
11280 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
11290 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
112a0 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
112b0 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f  ing a subdirecto
112c0 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ry in the same d
112d0 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74  irectory as.** t
112e0 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
112f0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
11300 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e  me but with a ".
11310 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20  lock" extension 
11320 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78  added..** The ex
11330 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63  istence of a loc
11340 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c  k directory impl
11350 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
11360 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
11370 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20  r.** lock types 
11380 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
11390 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
113a0 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
113b0 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
113c0 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
113d0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
113e0 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
113f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
11400 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
11410 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64  directory..*/.#d
11420 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
11430 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
11440 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11450 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
11460 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
11470 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
11480 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
11490 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
114a0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
114b0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
114c0 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
114d0 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
114e0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
114f0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11500 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
11510 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
11520 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
11530 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
11540 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
11550 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
11560 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
11570 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
11580 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
11590 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
115a0 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
115b0 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
115c0 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
115d0 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
115e0 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
115f0 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
11600 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
11610 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
11620 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
11630 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
11640 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
11650 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
11660 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11670 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
11680 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11690 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
116a0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
116b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
116c0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
116d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
116e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
116f0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
11700 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
11710 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11720 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
11730 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
11740 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
11750 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
11760 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
11770 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
11780 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
11790 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
117a0 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  n or some other 
117b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68  connection in th
117c0 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20  e same process. 
117d0 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f     ** holds a lo
117e0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ck on the file. 
117f0 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   No need to chec
11800 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  k further. */.  
11810 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
11820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11830 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  The lock is held
11840 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
11850 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69  the lockfile exi
11860 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  sts */.    const
11870 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
11880 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
11890 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
118a0 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72  ntext;.    reser
118b0 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a  ved = osAccess(z
118c0 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
118d0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
118e0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
118f0 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
11900 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
11910 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
11920 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
11930 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
11940 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
11950 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
11960 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
11970 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
11980 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
11990 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
119a0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
119b0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
119c0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
119d0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
119e0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
119f0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
11a00 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
11a10 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
11a20 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
11a30 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
11a40 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
11a50 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
11a60 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
11a70 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
11a80 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
11a90 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
11aa0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
11ab0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
11ac0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
11ad0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
11ae0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
11af0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
11b00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
11b10 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
11b20 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
11b30 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
11b40 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
11b50 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
11b60 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
11b70 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
11b80 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
11b90 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
11ba0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11bb0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
11bc0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
11bd0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11be0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
11bf0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
11c00 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
11c10 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
11c20 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
11c30 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
11c40 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
11c50 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
11c60 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
11c70 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
11c80 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
11c90 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
11ca0 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
11cb0 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
11cc0 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
11cd0 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
11ce0 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
11cf0 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
11d00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11d10 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
11d20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
11d30 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11d40 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
11d50 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
11d60 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
11d70 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
11d80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
11d90 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
11da0 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
11db0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
11dc0 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
11dd0 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
11de0 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
11df0 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
11e00 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
11e10 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
11e20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11e30 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
11e40 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11e50 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11e60 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
11e70 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
11e80 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
11e90 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
11ea0 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
11eb0 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
11ec0 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
11ed0 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
11ee0 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
11ef0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11f00 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11f10 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11f20 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
11f30 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
11f40 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
11f50 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
11f60 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
11f70 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
11f80 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
11f90 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
11fa0 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
11fb0 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
11fc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11fd0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
11fe0 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
11ff0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
12000 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
12010 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
12020 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
12030 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
12040 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  c) ){.        st
12050 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
12060 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
12070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
12080 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20  eturn rc;.  } . 
12090 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
120a0 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
120b0 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
120c0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
120d0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
120e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
120f0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
12100 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
12110 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
12120 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
12130 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
12140 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
12150 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
12160 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
12170 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
12180 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
12190 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
121a0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
121b0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
121c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
121d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
121e0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57  a no-op..**.** W
121f0 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  hen the locking 
12200 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f  level reaches NO
12210 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68  _LOCK, delete th
12220 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  e lock file..*/.
12230 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
12240 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
12250 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
12260 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
12270 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12280 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12290 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
122a0 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
122b0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
122c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
122d0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
122e0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
122f0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
12300 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b   pid=%d (dotlock
12310 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12320 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
12330 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
12340 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
12350 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (0)));.  assert(
12360 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
12370 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
12380 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
12390 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
123a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
123b0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
123c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
123d0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20  K;.  }..  /* To 
123e0 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61  downgrade to sha
123f0 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61  red, simply upda
12400 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
12410 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  notion of the.  
12420 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20  ** lock state.  
12430 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20  No need to mess 
12440 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e  with the file on
12450 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   disk..  */.  if
12460 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
12470 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
12480 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12490 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
124a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
124b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
124c0 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63  * To fully unloc
124d0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
124e0 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
124f0 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  file */.  assert
12500 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
12510 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f  LOCK );.  rc = o
12520 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65  sRmdir(zLockFile
12530 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26  );.  if( rc<0 &&
12540 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20   errno==ENOTDIR 
12550 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28  ) rc = osUnlink(
12560 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
12570 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e  ( rc<0 ){.    in
12580 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
12590 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  ;.    rc = 0;.  
125a0 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20    if( ENOENT != 
125b0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
125c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
125d0 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  R_UNLOCK;.    }.
125e0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
125f0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
12600 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
12610 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
12620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
12630 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
12640 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
12650 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
12660 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12670 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
12680 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ile.  Make sure 
12690 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
126a0 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72  n released befor
126b0 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e closing..*/.st
126c0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
126d0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
126e0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
126f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12700 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
12710 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12720 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12730 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  .    dotlockUnlo
12740 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
12750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12760 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
12770 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63  Context);.    rc
12780 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
12790 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
127a0 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn rc;.}./******
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
127c0 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65   of the dot-file
127d0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
127e0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
127f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12890 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
128a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128b0 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b  **** Begin flock
128c0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
128d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
128f0 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20  Use the flock() 
12900 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64  system call to d
12910 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  o file locking..
12920 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  **.** flock() lo
12930 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
12940 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  t-file locking i
12950 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f  n that the vario
12960 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e  us.** fine-grain
12970 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
12980 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
12990 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65  ite are collapse
129a0 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  d into.** a sing
129b0 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  le exclusive loc
129c0 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
129d0 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  ds, SHARED, RESE
129e0 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e  RVED, and.** PEN
129f0 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74  DING locks are t
12a00 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
12a10 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
12a20 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73  ck.  SQLite.** s
12a30 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20  till works when 
12a40 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74  you do this, but
12a50 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20   concurrency is 
12a60 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a  reduced since.**
12a70 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   only a single p
12a80 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65  rocess can be re
12a90 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
12aa0 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a  se at a time..**
12ab0 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65  .** Omit this se
12ac0 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ction if SQLITE_
12ad0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12ae0 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f  TYLE is turned o
12af0 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ff.*/.#if SQLITE
12b00 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
12b10 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  STYLE../*.** Ret
12b20 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
12b30 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
12b40 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
12b50 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
12b60 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
12b70 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
12b80 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
12b90 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
12ba0 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
12bb0 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
12bc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12bd0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
12be0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
12bf0 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
12c00 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
12c10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
12c20 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
12c30 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
12c40 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
12c50 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
12c60 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
12c70 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
12c80 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
12c90 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
12ca0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
12cb0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
12cc0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
12cd0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
12ce0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
12cf0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
12d00 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
12d10 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
12d20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
12d30 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
12d40 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
12d50 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
12d60 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12d70 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
12d80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12d90 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
12da0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
12db0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12dc0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
12dd0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
12de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12df0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
12e00 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
12e10 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
12e20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
12e30 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
12e40 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
12e50 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
12e60 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12e70 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
12e80 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
12e90 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
12ea0 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
12eb0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
12ec0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
12ed0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
12ee0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
12ef0 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
12f00 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
12f10 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
12f20 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
12f30 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
12f40 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
12f50 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
12f60 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
12f70 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
12f80 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
12f90 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
12fa0 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
12fb0 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
12fc0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12fd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
12fe0 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
12ff0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
13000 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
13010 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
13020 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
13030 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
13040 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
13050 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
13060 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
13070 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
13080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13090 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
130a0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
130b0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
130c0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
130d0 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
130e0 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
130f0 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
13100 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
13110 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
13120 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
13130 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
13140 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
13150 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
13160 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
13170 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
13180 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
13190 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
131a0 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
131b0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
131c0 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
131d0 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
131e0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
131f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13200 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
13210 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
13220 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
13230 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
13240 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
13250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65  QLITE_OK;.    re
13260 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65  served=1;.  }.#e
13270 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
13280 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
13290 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52  _ERRORS */.  *pR
132a0 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
132b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
132c0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
132d0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
132e0 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
132f0 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
13300 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
13310 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
13320 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
13330 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
13340 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
13350 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
13360 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
13370 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
13380 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
13390 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
133a0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
133b0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
133c0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
133d0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
133e0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
133f0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
13400 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
13410 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
13420 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
13430 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
13440 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
13450 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
13460 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
13470 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
13480 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
13490 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
134a0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
134b0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
134c0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
134d0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
134e0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
134f0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
13500 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
13510 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
13520 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
13530 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
13540 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
13550 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
13560 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
13570 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
13580 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
13590 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
135a0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
135b0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
135c0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
135d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
135e0 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
135f0 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
13600 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
13610 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
13620 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
13630 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
13640 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
13650 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
13660 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13670 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
13680 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
13690 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
136a0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
136b0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
136c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
136d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
136e0 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
136f0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
13700 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
13710 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13720 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13730 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13740 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
13750 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66  File );..  /* if
13760 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
13770 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
13780 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
13790 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
137a0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
137b0 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
137c0 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
137d0 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
137e0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
137f0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
13800 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
13810 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13820 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
13830 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
13840 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f    .  if (robust_
13850 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
13860 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
13870 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45  B)) {.    int tE
13880 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
13890 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c    /* didn't get,
138a0 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f   must be busy */
138b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
138c0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
138d0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
138e0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
138f0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
13900 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
13910 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
13920 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
13930 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
13940 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74   {.    /* got it
13950 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
13960 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
13970 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13980 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
13990 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
139a0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
139b0 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %s (flock)\n", p
139c0 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
139d0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
139e0 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
139f0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
13a00 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23   : "failed"));.#
13a10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
13a20 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13a30 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
13a40 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
13a50 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
13a60 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
13a70 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
13a80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
13a90 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13aa0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
13ab0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
13ac0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
13ad0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
13ae0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
13af0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
13b00 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
13b10 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
13b20 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
13b30 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
13b40 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13b50 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
13b60 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
13b70 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
13b80 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13b90 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
13ba0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
13bb0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
13bc0 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
13bd0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13be0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
13bf0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
13c00 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13c10 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
13c20 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
13c30 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
13c40 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
13c50 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
13c60 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
13c70 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
13c80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13c90 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
13ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
13cb0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
13cc0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
13cd0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
13ce0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
13cf0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
13d00 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
13d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13d20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
13d30 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
13d40 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
13d50 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
13d60 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
13d70 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
13d80 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
13d90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
13da0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
13db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13dc0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
13dd0 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
13de0 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f  */.  if( robust_
13df0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
13e00 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64  LOCK_UN) ){.#ifd
13e10 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
13e20 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
13e30 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  RS.    return SQ
13e40 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20  LITE_OK;.#endif 
13e50 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
13e60 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
13e70 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  RS */.    return
13e80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
13e90 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LOCK;.  }else{. 
13ea0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13eb0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
13ec0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13ed0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
13ee0 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
13ef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
13f00 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
13f10 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
13f20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13f30 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
13f40 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
13f50 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
13f60 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
13f70 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ile(id);.  }.  r
13f80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
13f90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
13fa0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
13fb0 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
13fc0 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */../**********
13fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
13fe0 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20   the flock lock 
13ff0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
14000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14010 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
14020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14060 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
14070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140b0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
140c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
140d0 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70  egin Named Semap
140e0 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  hore Locking ***
140f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14100 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65  *****.**.** Name
14110 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
14120 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70  ing is only supp
14130 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  orted on VxWorks
14140 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  ..**.** Semaphor
14150 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  e locking is lik
14160 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66  e dot-lock and f
14170 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20  lock in that it 
14180 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73  really only.** s
14190 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56  upports EXCLUSIV
141a0 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79  E locking.  Only
141b0 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
141c0 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72  s can read or wr
141d0 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ite.** the datab
141e0 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69  ase file at a ti
141f0 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65  me.  This reduce
14200 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63  s potential conc
14210 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20  urrency, but.** 
14220 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69  makes the lock i
14230 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75  mplementation mu
14240 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69  ch easier..*/.#i
14250 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a  f OS_VXWORKS../*
14260 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14270 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
14280 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
14290 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
142a0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
142b0 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
142c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
142d0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
142e0 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
142f0 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
14300 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
14310 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
14320 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
14330 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
14340 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
14350 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
14360 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
14370 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
14380 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
14390 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65 63 6b  ic int semXCheck
143a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
143b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
143c0 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
143d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
143e0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
143f0 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
14400 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14410 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
14420 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
14430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
14440 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
14450 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
14460 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14470 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
14480 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
14490 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
144a0 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
144b0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
144c0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
144d0 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
144e0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
144f0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
14500 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
14510 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
14520 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
14530 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a  d ){.    sem_t *
14540 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
14550 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20  node->pSem;..   
14560 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
14570 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
14580 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
14590 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
145a0 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72  ( EAGAIN != tErr
145b0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
145c0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
145d0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
145e0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
145f0 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
14600 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74  OCK);.        st
14610 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
14620 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
14630 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
14640 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
14650 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b  lse has the lock
14660 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20   when we are in 
14670 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20  NO_LOCK */.     
14680 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70     reserved = (p
14690 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
146a0 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  < SHARED_LOCK);.
146b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
146c0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63  e{.      /* we c
146d0 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20  ould have it if 
146e0 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20  we want it */.  
146f0 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65      sem_post(pSe
14700 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  m);.    }.  }.  
14710 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
14720 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
14730 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
14740 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
14750 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
14760 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
14770 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14780 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
14790 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
147a0 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
147b0 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
147c0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
147d0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
147e0 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
147f0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
14800 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
14810 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
14820 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
14830 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
14840 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
14850 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
14860 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
14870 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
14880 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
14890 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
148a0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
148b0 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
148c0 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
148d0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
148e0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
148f0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
14900 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
14910 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
14920 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
14930 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
14940 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
14950 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
14960 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
14970 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
14980 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
14990 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
149a0 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
149b0 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
149c0 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
149d0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
149e0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
149f0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
14a00 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
14a10 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
14a20 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
14a30 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
14a40 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ocks only really
14a50 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
14a60 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
14a70 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
14a80 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
14a90 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
14aa0 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
14ab0 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
14ac0 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
14ad0 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
14ae0 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
14af0 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
14b00 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
14b10 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
14b20 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
14b30 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
14b40 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
14b50 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
14b60 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
14b70 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
14b80 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
14b90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14ba0 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33  semXLock(sqlite3
14bb0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
14bc0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
14bd0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14be0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14bf0 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
14c00 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
14c10 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
14c20 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
14c30 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
14c40 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
14c50 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
14c60 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
14c70 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
14c80 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
14c90 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
14ca0 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
14cb0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
14cc0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
14cd0 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
14ce0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
14cf0 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
14d00 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
14d10 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
14d20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
14d30 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
14d40 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
14d50 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
14d60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
14d70 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
14d80 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
14d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
14da0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
14db0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
14dc0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
14dd0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14de0 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
14df0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14e00 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
14e10 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14e20 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
14e30 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
14e40 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
14e50 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
14e60 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
14e70 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
14e80 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
14e90 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
14ea0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
14eb0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
14ec0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
14ed0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
14ee0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
14ef0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
14f00 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 55  static int semXU
14f10 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
14f20 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
14f30 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
14f40 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14f50 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
14f60 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
14f70 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
14f80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
14f90 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
14fa0 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  Sem );.  OSTRACE
14fb0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
14fc0 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
14fd0 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
14fe0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
14ff0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15000 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74  eFileLock, osGet
15010 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65  pid(0)));.  asse
15020 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
15030 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
15040 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
15050 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
15060 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15070 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
15080 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15090 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
150a0 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
150b0 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
150c0 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
150d0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
150e0 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
150f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
15100 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15110 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
15120 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15130 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
15140 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75   /* no, really u
15150 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28  nlock. */.  if (
15160 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d   sem_post(pSem)=
15170 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
15180 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  rc, tErrno = err
15190 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  no;.    rc = sql
151a0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
151b0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
151c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
151d0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
151e0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
151f0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
15200 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
15210 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
15220 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
15230 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
15240 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
15250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15260 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
15270 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
15280 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43 6c  tatic int semXCl
15290 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
152a0 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
152b0 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
152c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
152d0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
152e0 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  XUnlock(id, NO_L
152f0 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
15300 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
15310 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
15320 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
15330 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
15340 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
15350 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  ();.    closeUni
15360 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
15370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15380 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
15390 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
153a0 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
153b0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
153c0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
153d0 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a   VxWorks..**.***
153e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
153f0 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65   of the named se
15400 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70  maphore lock imp
15410 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
15420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
15430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
15480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
154d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
154f0 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   AFP Locking ***
15500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
15520 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20  *.** AFP is the 
15530 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f  Apple Filing Pro
15540 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61  tocol.  AFP is a
15550 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73   network filesys
15560 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20  tem found.** on 
15570 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20  Apple Macintosh 
15580 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68  computers - both
15590 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a   OS9 and OSX..**
155a0 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20  .** Third-party 
155b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
155c0 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c  of AFP are avail
155d0 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20  able.  But this 
155e0 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c  code here.** onl
155f0 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a  y works on OSX..
15600 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
15610 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
15620 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
15630 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
15640 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
15650 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
15660 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
15670 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
15680 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  tate.*/.typedef 
15690 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
156a0 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
156b0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
156c0 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
156d0 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73  text {.  int res
156e0 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63  erved;.  const c
156f0 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
15700 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15710 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
15720 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
15730 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
15740 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
15750 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
15760 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
15770 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
15780 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
15790 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
157a0 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
157b0 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
157c0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
157d0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
157e0 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
157f0 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
15800 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
15810 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
15820 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
15830 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
15840 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
15850 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
15860 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
15870 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
15880 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
15890 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
158a0 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
158d0 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
158e0 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
158f0 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
15900 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
15910 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
15920 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
15930 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
15940 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
15950 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
15960 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
15970 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
15980 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
15990 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
159a0 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
159b0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
159c0 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
159d0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
159e0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
159f0 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
15a00 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
15a10 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
15a20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
15a30 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
15a40 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
15a50 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
15a60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
15a70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15a80 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
15a90 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15aa0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
15ab0 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
15ac0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
15ad0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
15ae0 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
15af0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
15b00 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
15b10 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
15b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15b30 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
15b40 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
15b50 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
15b60 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
15b70 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
15b80 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
15b90 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
15ba0 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
15bb0 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
15bc0 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
15bd0 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
15be0 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
15bf0 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
15c00 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
15c10 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
15c20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
15c30 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
15c40 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
15c50 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
15c60 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
15c70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
15c80 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
15c90 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29  offset, length))
15ca0 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
15cb0 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
15cc0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
15cd0 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
15ce0 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
15cf0 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
15d00 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
15d10 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46      OSTRACE(("AF
15d20 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20  PSETLOCK failed 
15d30 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
15d40 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
15d50 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72         path, tEr
15d60 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
15d70 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20  rrno)));.#ifdef 
15d80 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
15d90 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  P_LOCK_ERRORS.  
15da0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15db0 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63  SY;.#else.    rc
15dc0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
15dd0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
15de0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
15df0 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b           setLock
15e00 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f  Flag ? SQLITE_IO
15e10 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54  ERR_LOCK : SQLIT
15e20 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
15e30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15e40 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
15e50 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
15e60 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15e70 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73  R(rc) ){.      s
15e80 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
15e90 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
15ea0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
15eb0 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
15ec0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15ed0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
15ee0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
15ef0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
15f00 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
15f10 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
15f20 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
15f30 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
15f40 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
15f50 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
15f60 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
15f70 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
15f80 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
15f90 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
15fa0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
15fb0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
15fc0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
15fd0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
15fe0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
15ff0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
16000 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
16010 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
16020 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
16030 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
16040 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
16050 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16060 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
16070 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
16080 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16090 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
160a0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
160b0 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  ext;.  .  Simula
160c0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
160d0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
160e0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
160f0 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
16100 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e  ( pFile );.  con
16110 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
16120 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
16130 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
16140 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78  xt;.  if( contex
16150 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
16160 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b     *pResOut = 1;
16170 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16180 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
16190 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
161a0 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
161b0 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
161c0 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
161d0 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   */.  .  /* Chec
161e0 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
161f0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
16200 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
16210 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
16220 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16230 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
16240 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
16250 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
16260 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
16270 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
16280 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20  ss holds it..   
16290 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
162a0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63  ed ){.    /* loc
162b0 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62  k the RESERVED b
162c0 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  yte */.    int l
162d0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
162e0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
162f0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
16300 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20  _BYTE, 1,1);  . 
16310 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
16320 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  ==lrc ){.      /
16330 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65  * if we succeede
16340 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20  d in taking the 
16350 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75  reserved lock, u
16360 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74  nlock it to rest
16370 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ore.      ** the
16380 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
16390 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61  */.      lrc = a
163a0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
163b0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
163c0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
163d0 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c   1, 0);.    } el
163e0 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  se {.      /* if
163f0 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65   we failed to ge
16400 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20  t the lock then 
16410 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73  someone else mus
16420 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20  t have it */.   
16430 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
16440 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
16450 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
16460 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72  ) ){.      rc=lr
16470 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  c;.    }.  }.  .
16480 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
16490 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
164a0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
164b0 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  %d %d (afp)\n", 
164c0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
164d0 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a  served));.  .  *
164e0 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
164f0 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
16500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
16510 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
16520 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
16530 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
16540 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
16550 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16560 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
16570 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
16580 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
16590 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
165a0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
165b0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
165c0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
165d0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
165e0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
165f0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
16600 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
16610 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
16620 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
16630 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
16640 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
16650 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
16660 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
16670 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
16680 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
16690 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
166a0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
166b0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
166c0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
166d0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
166e0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
166f0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
16700 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
16710 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
16720 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
16730 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
16740 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
16750 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
16760 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
16770 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
16780 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16790 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
167a0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
167b0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
167c0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
167d0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
167e0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
167f0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
16800 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
16810 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
16820 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
16830 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
16840 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16850 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69   eFileLock){.  i
16860 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16870 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
16880 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16890 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
168a0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
168b0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
168c0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
168d0 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
168e0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
168f0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
16900 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
16910 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
16920 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
16930 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
16940 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
16950 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
16960 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
16970 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
16980 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
16990 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
169a0 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  k),.           a
169b0 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65  zFileLock(pInode
169c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49  ->eFileLock), pI
169d0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
169e0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
169f0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
16a00 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
16a10 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
16a20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
16a30 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
16a40 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
16a50 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
16a60 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
16a70 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
16a80 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
16a90 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
16aa0 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
16ab0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
16ac0 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
16ad0 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
16ae0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
16af0 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
16b00 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  d) (afp)\n", pFi
16b10 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
16b20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
16b30 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
16b40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16b50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
16b60 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
16b70 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
16b80 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57  rect.  **  (1) W
16b90 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
16ba0 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
16bb0 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
16bc0 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
16bd0 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
16be0 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
16bf0 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
16c00 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
16c10 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
16c20 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
16c30 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
16c40 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
16c50 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
16c60 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16c70 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
16c80 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16c90 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
16ca0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
16cb0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
16cc0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
16cd0 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
16ce0 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
16cf0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16d00 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
16d10 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
16d20 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
16d30 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
16d40 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
16d50 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
16d60 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
16d70 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
16d80 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
16d90 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
16da0 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
16db0 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
16dc0 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
16dd0 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
16de0 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
16df0 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
16e00 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
16e10 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
16e20 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
16e30 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
16e40 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
16e50 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
16e60 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
16e70 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
16e80 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d       ){.    rc =
16e90 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
16ea0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
16eb0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
16ec0 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
16ed0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
16ee0 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
16ef0 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
16f00 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
16f10 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
16f20 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
16f30 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
16f40 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
16f50 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
16f60 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
16f70 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
16f80 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
16f90 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
16fa0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16fb0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
16fc0 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
16fd0 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
16fe0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
16ff0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
17000 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
17010 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
17020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
17030 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
17040 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
17050 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
17060 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
17070 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
17080 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
17090 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  +;.    goto afp_
170a0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
170b0 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e    .  /* A PENDIN
170c0 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
170d0 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
170e0 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
170f0 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
17100 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
17110 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
17120 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
17130 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
17140 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
17150 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
17160 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
17170 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
17180 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
17190 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
171a0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
171b0 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
171c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
171d0 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  ed;.    failed =
171e0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
171f0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17200 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
17210 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20  , 1, 1);.    if 
17220 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
17230 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
17240 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
17250 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
17260 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  .  .  /* If cont
17270 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
17280 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
17290 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
172a0 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
172b0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
172c0 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
172d0 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
172e0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
172f0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
17300 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c  .    int lrc1, l
17310 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d  rc2, lrc1Errno =
17320 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c   0;.    long lk,
17330 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20   mask;.    .    
17340 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17350 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
17360 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
17370 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
17380 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d  ;.        .    m
17390 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f  ask = (sizeof(lo
173a0 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53  ng)==8) ? LARGES
173b0 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66  T_INT64 : 0x7fff
173c0 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77  ffff;.    /* Now
173d0 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
173e0 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
173f0 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
17400 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
17410 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
17420 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
17430 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
17440 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
17450 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61  .    pInode->sha
17460 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20  redByte = (lk & 
17470 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49  mask)%(SHARED_SI
17480 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63  ZE - 1);.    lrc
17490 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  1 = afpSetLock(c
174a0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
174b0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
174c0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
174d0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
174e0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  e, 1, 1);.    if
174f0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17500 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c  lrc1) ){.      l
17510 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65  rc1Errno = pFile
17520 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
17530 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
17540 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
17550 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
17560 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f   lrc2 = afpSetLo
17570 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17580 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
17590 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
175a0 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f      .    if( IS_
175b0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
175c0 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f 72 65   ) {.      store
175d0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
175e0 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20   lrc1Errno);.   
175f0 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
17600 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
17610 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
17620 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52  e if( IS_LOCK_ER
17630 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20  ROR(lrc2) ){.   
17640 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20     rc = lrc2;.  
17650 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
17660 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
17670 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51  e if( lrc1 != SQ
17680 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
17690 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
176a0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
176b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
176c0 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
176d0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
176e0 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
176f0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
17700 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
17710 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
17720 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
17730 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17740 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
17750 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
17760 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
17770 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
17780 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
17790 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
177a0 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
177b0 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
177c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
177d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
177e0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
177f0 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
17800 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
17810 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
17820 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
17830 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
17840 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
17850 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
17860 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
17870 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
17880 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a  int failed = 0;.
17890 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
178a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
178b0 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65  );.    if (eFile
178c0 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44  Lock >= RESERVED
178d0 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
178e0 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45  eFileLock < RESE
178f0 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
17900 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
17910 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
17920 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
17930 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
17940 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17950 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
17960 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20  BYTE, 1,1);.    
17970 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b    if( !failed ){
17980 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
17990 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a  ->reserved = 1;.
179a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
179b0 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
179c0 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58   eFileLock == EX
179d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
179e0 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
179f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
17a00 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20  ck */.        . 
17a10 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
17a20 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62  he shared lock b
17a30 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65  efore trying the
17a40 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e   range.  we'll n
17a50 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  eed to .      **
17a60 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
17a70 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
17a80 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65  we can't get the
17a90 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20    afpUnlock.    
17aa0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
17ab0 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74  (failed = afpSet
17ac0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17ad0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
17ae0 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61       pInode->sha
17b10 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20  redByte, 1, 0)) 
17b20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
17b30 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f  ailed2 = SQLITE_
17b40 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e  OK;.        /* n
17b50 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67  ow attemmpt to g
17b60 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
17b70 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
17b80 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
17b90 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17ba0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17bb0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
17bc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
17bf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61  ;.        if( fa
17c00 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32  iled && (failed2
17c10 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17c20 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17c30 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
17c50 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e  ARED_FIRST + pIn
17c60 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
17c70 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20   1, 1)) ){.     
17c80 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65       /* Can't re
17c90 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
17ca0 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69  ared lock.  Sqli
17cb0 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74  te can't deal, t
17cc0 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20  his is.         
17cd0 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49   ** a critical I
17ce0 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  /O error.       
17cf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17d00 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20  rc = ((failed & 
17d10 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
17d20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f   SQLITE_IOERR) ?
17d30 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20   failed2 : .    
17d40 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17d50 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
17d60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70          goto afp
17d70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20  _end_lock;.     
17d80 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73     } .      }els
17d90 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
17da0 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d  failed; .      }
17db0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
17dc0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
17dd0 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
17de0 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  }.  }.  .  if( r
17df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17e00 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
17e10 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
17e20 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
17e30 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
17e40 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
17e50 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
17e60 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
17e70 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
17e80 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
17e90 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
17ea0 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
17eb0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a  NG_LOCK;.  }.  .
17ec0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  afp_end_lock:.  
17ed0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
17ee0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
17ef0 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
17f00 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
17f10 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
17f20 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
17f30 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
17f40 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
17f50 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
17f60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
17f70 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
17f80 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
17f90 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
17fa0 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
17fb0 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
17fc0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
17fd0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
17fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
17ff0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
18000 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
18010 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
18020 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
18030 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
18040 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
18050 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
18060 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
18070 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   afpUnlock(sqlit
18080 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
18090 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
180a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
180b0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
180c0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
180d0 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
180e0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
180f0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
18100 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
18110 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
18120 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
18130 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
18140 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30  t skipShared = 0
18150 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18160 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70  TEST.  int h = p
18170 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a  File->h;.#endif.
18180 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
18190 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
181a0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
181b0 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
181c0 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
181d0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
181e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
181f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
18200 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
18210 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
18220 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
18230 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
18240 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73  tpid(0)));..  as
18250 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
18260 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
18270 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
18280 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
18290 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
182a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
182b0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
182c0 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
182d0 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
182e0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
182f0 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
18300 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
18310 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
18320 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18330 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
18340 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
18350 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  ck );.    Simula
18360 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
18370 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  1);.    Simulate
18380 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
18390 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ).    SimulateIO
183a0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
183b0 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
183c0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
183d0 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
183e0 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
183f0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
18400 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
18410 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
18420 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
18430 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
18440 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
18450 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
18460 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
18470 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
18480 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
18490 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
184a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
184b0 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
184c0 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
184d0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
184e0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
184f0 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
18500 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
18510 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
18520 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
18530 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
18540 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
18550 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
18560 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
18570 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
18580 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
18590 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
185a0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
185b0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30  inNormalWrite==0
185c0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
185d0 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
185e0 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
185f0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
18600 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Chng==1 );.    p
18610 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
18620 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
18630 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69      .    if( pFi
18640 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  le->eFileLock==E
18650 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
18660 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
18670 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
18680 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
18690 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41  HARED_FIRST, SHA
186a0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
186b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
186c0 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c  TE_OK && (eFileL
186d0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
186e0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   || pInode->nSha
186f0 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  red>1) ){.      
18700 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74    /* only re-est
18710 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
18720 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73  d lock if necess
18730 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ary */.        i
18740 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  nt sharedLockByt
18750 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
18760 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
18770 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20  yte;.        rc 
18780 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
18790 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
187a0 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
187b0 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
187c0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
187d0 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20     skipShared = 
187e0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
187f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18800 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
18810 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
18820 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
18830 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
18840 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
18850 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
18860 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
18870 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63     } .    if( rc
18880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
18890 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
188a0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
188b0 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  & context->reser
188c0 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ved ){.      rc 
188d0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
188e0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
188f0 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
18900 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  TE, 1, 0);.     
18910 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20   if( !rc ){ .   
18920 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
18930 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20  served = 0; .   
18940 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
18950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18960 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
18970 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
18980 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
18990 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  )){.      pInode
189a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
189b0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
189c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
189d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c  QLITE_OK && eFil
189e0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
189f0 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  {..    /* Decrem
18a00 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
18a10 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
18a20 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
18a30 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
18a40 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
18a50 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
18a60 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
18a70 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
18a80 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
18a90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69  .    */.    unsi
18aa0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
18ab0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
18ac0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
18ad0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
18ae0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
18af0 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
18b00 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
18b10 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75  =0 ){.      Simu
18b20 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
18b30 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
18b40 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
18b50 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
18b60 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
18b70 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
18b80 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20  !skipShared ){. 
18b90 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
18ba0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
18bb0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
18bc0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
18bd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
18be0 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
18bf0 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
18c00 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
18c10 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
18c20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
18c30 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
18c40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
18c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18c60 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
18c70 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65  ck--;.      asse
18c80 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
18c90 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  k>=0 );.      if
18ca0 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
18cb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
18cc0 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
18cd0 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ile);.      }.  
18ce0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
18cf0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
18d00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18d10 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c  OK ) pFile->eFil
18d20 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
18d30 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
18d40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
18d50 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
18d60 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
18d70 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
18d80 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
18d90 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
18da0 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
18db0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18dc0 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
18dd0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
18de0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
18df0 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64      afpUnlock(id
18e00 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
18e10 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
18e20 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
18e30 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65  >pInode && pFile
18e40 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
18e50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
18e60 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
18e70 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
18e80 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
18e90 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
18ea0 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63        ** yet bec
18eb0 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
18ec0 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
18ed0 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
18ee0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
18ef0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
18f00 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e   pInode->aPendin
18f10 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  g.  It will be a
18f20 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
18f30 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  sed when.      *
18f40 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
18f50 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
18f60 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65    */.      setPe
18f70 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
18f80 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
18f90 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
18fa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
18fb0 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
18fc0 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
18fd0 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
18fe0 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78  le(id);.    unix
18ff0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
19000 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19010 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
19020 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
19030 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
19040 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
19050 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
19060 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50  above is the AFP
19070 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
19080 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
19090 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
190a0 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
190b0 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
190c0 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
190d0 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
190e0 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
190f0 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e  ble.  If you don
19100 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61  't compile for a
19110 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22   mac, then the "
19120 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53  unix-afp".** VFS
19130 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
19140 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
19150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
19160 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  of the AFP lock 
19170 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
19180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19190 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
191a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191e0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
191f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19230 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19250 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63  ** Begin NFS Loc
19260 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
19270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19280 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  *****/..#if defi
19290 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
192a0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
192b0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
192c0 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  . ** Lower the l
192d0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
192e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
192f0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
19300 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20  ck.  eFileLock. 
19310 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
19320 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
19330 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a  RED_LOCK.. **. *
19340 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
19350 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
19360 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
19370 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
19380 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71  elow. ** the req
19390 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
193a0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
193b0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ne is a no-op.. 
193c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66  */.static int nf
193d0 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
193e0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
193f0 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75  ileLock){.  retu
19400 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
19410 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29  d, eFileLock, 1)
19420 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
19430 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
19440 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
19450 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
19460 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
19470 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
19480 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
19490 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
194a0 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
194b0 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
194c0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
194d0 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
194e0 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
194f0 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
19500 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a  ilable.  .**.***
19510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19520 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46  ** End of the NF
19530 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
19540 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
19550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
19560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
195b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
19610 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  on-locking sqlit
19620 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20  e3_file methods 
19630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19650 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76  .** The next div
19660 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69  ision contains i
19670 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
19680 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f  or all methods o
19690 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  f the .** sqlite
196a0 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74  3_file object ot
196b0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63  her than the loc
196c0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54  king methods.  T
196d0 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65  he locking.** me
196e0 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e  thods were defin
196f0 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20  ed in divisions 
19700 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69  above (one locki
19710 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a  ng method per.**
19720 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f   division).  Tho
19730 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  se methods that 
19740 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  are common to al
19750 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a  l locking modes.
19760 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f  ** are gather to
19770 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73  gether into this
19780 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f   division..*/../
19790 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
197a0 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61   offset passed a
197b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
197c0 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64  ument, then read
197d0 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69   cnt .** bytes i
197e0 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e  nto pBuf. Return
197f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19800 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
19810 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49  ad..**.** NB:  I
19820 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45  f you define USE
19830 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52  _PREAD or USE_PR
19840 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d  EAD64, then it m
19850 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20  ight also.** be 
19860 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66  necessary to def
19870 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
19880 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68  E to be 500.  Th
19890 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a  is varies from.*
198a0 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20  * one system to 
198b0 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20  another.  Since 
198c0 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
198d0 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
198e0 0a 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20  .** in any form 
198f0 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
19900 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
19910 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
19920 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
19930 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
19940 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
19950 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
19960 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
19970 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
19980 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
19990 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
199a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
199b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
199c0 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
199d0 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
199e0 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
199f0 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
19a00 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
19a10 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30  .  int prior = 0
19a20 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
19a30 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
19a40 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19a50 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
19a60 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
19a70 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73  IMER_START;.  as
19a80 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26  sert( cnt==(cnt&
19a90 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73  0x1ffff) );.  as
19aa0 73 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b  sert( id->h>2 );
19ab0 0a 20 20 63 6e 74 20 26 3d 20 30 78 31 66 66 66  .  cnt &= 0x1fff
19ac0 66 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66  f;.  do{.#if def
19ad0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
19ae0 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
19af0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
19b00 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
19b10 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19b20 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
19b30 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
19b40 50 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74  PREAD64).    got
19b50 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d   = osPread64(id-
19b60 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
19b70 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
19b80 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
19b90 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
19ba0 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c     newOffset = l
19bb0 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
19bc0 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
19bd0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19be0 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20  or( newOffset-- 
19bf0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  );.    if( newOf
19c00 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
19c10 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66        if( newOff
19c20 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  set == -1 ){.   
19c30 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
19c40 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rno((unixFile*)i
19c50 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  d, errno);.     
19c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19c70 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
19c80 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 30 29  unixFile*)id, 0)
19c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19ca0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
19cb0 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61  .    got = osRea
19cc0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
19cd0 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nt);.#endif.    
19ce0 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62  if( got==cnt ) b
19cf0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f  reak;.    if( go
19d00 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  t<0 ){.      if(
19d10 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b   errno==EINTR ){
19d20 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e   got = 1; contin
19d30 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f  ue; }.      prio
19d40 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 6f  r = 0;.      sto
19d50 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69  reLastErrno((uni
19d60 78 46 69 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e  xFile*)id,  errn
19d70 6f 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  o);.      break;
19d80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67  .    }else if( g
19d90 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  ot>0 ){.      cn
19da0 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t -= got;.      
19db0 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20  offset += got;. 
19dc0 20 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f       prior += go
19dd0 74 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  t;.      pBuf = 
19de0 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63  (void*)(got + (c
19df0 68 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20  har*)pBuf);.    
19e00 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e  }.  }while( got>
19e10 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44  0 );.  TIMER_END
19e20 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
19e30 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25  AD    %-3d %5d %
19e40 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20  7lld %llu\n",.  
19e50 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c            id->h,
19e60 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73   got+prior, offs
19e70 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f  et-prior, TIMER_
19e80 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74  ELAPSED));.  ret
19e90 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d  urn got+prior;.}
19ea0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
19eb0 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
19ec0 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
19ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
19ee0 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
19ef0 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
19f00 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
19f10 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
19f20 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
19f30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19f40 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69  unixRead(.  sqli
19f50 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
19f60 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
19f70 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
19f80 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a  e3_int64 offset.
19f90 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
19fa0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
19fb0 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74   *)id;.  int got
19fc0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
19fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
19fe0 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  et>=0 );.  asser
19ff0 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
1a000 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
1a010 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
1a020 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
1a030 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
1a040 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
1a050 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
1a060 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
1a070 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
1a080 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
1a090 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
1a0a0 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
1a0b0 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1a0c0 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1a0d0 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1a0e0 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1a0f0 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1a100 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1a110 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1a120 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1a130 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1a140 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
1a150 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
1a160 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
1a170 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
1a180 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
1a190 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
1a1a0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
1a1b0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1a1c0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
1a1d0 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
1a1e0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1a1f0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
1a200 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1a210 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1a220 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  ], amt);.      r
1a230 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a250 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
1a260 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
1a270 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
1a280 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
1a290 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1a2a0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1a2b0 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
1a2c0 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
1a2d0 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
1a2e0 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
1a2f0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1a300 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
1a310 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d  .#endif..  got =
1a320 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
1a330 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1a340 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
1a350 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
1a360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a370 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
1a380 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74  0 ){.    /* last
1a390 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1a3a0 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
1a3b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a3c0 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
1a3d0 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  e{.    storeLast
1a3e0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b  Errno(pFile, 0);
1a3f0 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74     /* not a syst
1a400 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1a410 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
1a420 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
1a430 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
1a440 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
1a450 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
1a460 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
1a470 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a480 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1a490 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
1a4a0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
1a4b0 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63  ek the file-desc
1a4c0 72 69 70 74 6f 72 20 70 61 73 73 65 64 20 61 73  riptor passed as
1a4d0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1a4e0 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75  ent to.** absolu
1a4f0 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20  te offset iOff, 
1a500 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  then attempt to 
1a510 77 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  write nBuf bytes
1a520 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a   of data from.**
1a530 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20   pBuf to it. If 
1a540 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1a550 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73   return -1 and s
1a560 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68  et *piErrno. Oth
1a570 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75  erwise, .** retu
1a580 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75  rn the actual nu
1a590 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
1a5a0 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79  itten (which may
1a5b0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a   be less than.**
1a5c0 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69   nBuf)..*/.stati
1a5d0 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1a5e0 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20  teFd(.  int fd, 
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1a610 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72  descriptor to wr
1a620 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
1a630 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20  iOff,           
1a640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a650 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  ile offset to be
1a660 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
1a670 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1a680 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1a690 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1a6a0 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65   from this buffe
1a6b0 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  r to the file */
1a6c0 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20  .  int nBuf,    
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
1a6f0 66 66 65 72 20 70 42 75 66 20 69 6e 20 62 79 74  ffer pBuf in byt
1a700 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45  es */.  int *piE
1a710 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  rrno            
1a720 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1a730 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20  Error number if 
1a740 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
1a750 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a770 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1a780 74 75 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d  turned by system
1a790 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   call */..  asse
1a7a0 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26  rt( nBuf==(nBuf&
1a7b0 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73  0x1ffff) );.  as
1a7c0 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20  sert( fd>2 );.  
1a7d0 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b  nBuf &= 0x1ffff;
1a7e0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1a7f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
1a800 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63  _PREAD).  do{ rc
1a810 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65   = (int)osPwrite
1a820 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c  (fd, pBuf, nBuf,
1a830 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20   iOff); }while( 
1a840 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1a850 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65  INTR );.#elif de
1a860 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1a870 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69  4).  do{ rc = (i
1a880 6e 74 29 6f 73 50 77 72 69 74 65 36 34 28 66 64  nt)osPwrite64(fd
1a890 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1a8a0 66 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30  ff);}while( rc<0
1a8b0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1a8c0 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20  );.#else.  do{. 
1a8d0 20 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c     i64 iSeek = l
1a8e0 73 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53  seek(fd, iOff, S
1a8f0 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1a900 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69  mulateIOError( i
1a910 53 65 65 6b 2d 2d 20 29 3b 0a 0a 20 20 20 20 69  Seek-- );..    i
1a920 66 28 20 69 53 65 65 6b 21 3d 69 4f 66 66 20 29  f( iSeek!=iOff )
1a930 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 45 72  {.      if( piEr
1a940 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d  rno ) *piErrno =
1a950 20 28 69 53 65 65 6b 3d 3d 2d 31 20 3f 20 65 72   (iSeek==-1 ? er
1a960 72 6e 6f 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  rno : 0);.      
1a970 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
1a980 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69 74  .    rc = osWrit
1a990 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1a9a0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3c  );.  }while( rc<
1a9b0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1a9c0 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54  R );.#endif..  T
1a9d0 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
1a9e0 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
1a9f0 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
1aa00 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f  u\n", fd, rc, iO
1aa10 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  ff, TIMER_ELAPSE
1aa20 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30  D));..  if( rc<0
1aa30 20 26 26 20 70 69 45 72 72 6e 6f 20 29 20 2a 70   && piErrno ) *p
1aa40 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  iErrno = errno;.
1aa50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aa60 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
1aa70 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d  he offset in id-
1aa80 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61  >offset then rea
1aa90 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f  d cnt bytes into
1aaa0 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e   pBuf..** Return
1aab0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1aac0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
1aad0 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20  ad.  Update the 
1aae0 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  offset..**.** To
1aaf0 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1ab00 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1ab10 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74  on a failed writ
1ab20 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  e the lastErrno 
1ab30 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
1ab40 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1ab50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ab60 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69  seekAndWrite(uni
1ab70 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  xFile *id, i64 o
1ab80 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69  ffset, const voi
1ab90 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1aba0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b  ){.  return seek
1abb0 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68  AndWriteFd(id->h
1abc0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1abd0 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72  cnt, &id->lastEr
1abe0 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rno);.}.../*.** 
1abf0 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
1ac00 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
1ac10 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
1ac20 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1ac30 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
1ac40 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
1ac50 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
1ac60 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
1ac70 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
1ac80 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
1ac90 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
1aca0 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
1acb0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
1acc0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1acd0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1ace0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f  e*)id;.  int wro
1acf0 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
1ad00 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1ad10 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
1ad20 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
1ad30 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
1ad40 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
1ad50 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
1ad60 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
1ad70 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
1ad80 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
1ad90 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
1ada0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
1adb0 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
1adc0 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
1add0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
1ade0 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
1adf0 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
1ae00 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
1ae10 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
1ae20 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1ae30 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1ae40 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1ae50 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1ae60 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1ae70 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
1ae80 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68  o.  ** doing a h
1ae90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1aea0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1aeb0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1aec0 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f  r than a.  ** no
1aed0 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
1aee0 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20  le) then record 
1aef0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
1af00 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
1af10 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66  has changed.  If
1af20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1af30 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69   counter is modi
1af40 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61  fied, record tha
1af50 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e  t.  ** fact too.
1af60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1af70 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1af80 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
1af90 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a  bUpdate = 1;  /*
1afa0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61   The database ha
1afb0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
1afc0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  */.    if( offse
1afd0 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b  t<=24 && offset+
1afe0 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20  amt>=27 ){.     
1aff0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63   int rc;.      c
1b000 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a  har oldCntr[4];.
1b010 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1b020 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1b030 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41        rc = seekA
1b040 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34  ndRead(pFile, 24
1b050 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20  , oldCntr, 4);. 
1b060 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1b070 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1b080 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c       if( rc!=4 |
1b090 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72  | memcmp(oldCntr
1b0a0 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  , &((char*)pBuf)
1b0b0 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21  [24-offset], 4)!
1b0c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1b0d0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1b0e0 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  ng = 1;  /* The 
1b0f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1b100 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20  ter has changed 
1b110 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
1b120 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1b130 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1b140 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
1b150 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
1b160 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71  f this write req
1b170 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
1b180 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
1b190 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
1b1a0 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
1b1b0 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
1b1c0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
1b1d0 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
1b1e0 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
1b1f0 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
1b200 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1b210 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
1b220 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
1b230 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
1b240 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
1b250 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b260 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1b270 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  .      int nCopy
1b280 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69   = pFile->mmapSi
1b290 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
1b2a0 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
1b2b0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1b2c0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1b2d0 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  pBuf, nCopy);.  
1b2e0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
1b2f0 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
1b300 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
1b310 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
1b320 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
1b330 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1b340 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
1b350 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64  (wrote = seekAnd
1b360 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66  Write(pFile, off
1b370 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  set, pBuf, amt))
1b380 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
1b390 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73   wrote;.    offs
1b3a0 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20  et += wrote;.   
1b3b0 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
1b3c0 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
1b3d0 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
1b3e0 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
1b3f0 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
1b400 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
1b410 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
1b420 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28  amt=1 ));..  if(
1b430 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
1b440 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69  ( wrote<0 && pFi
1b450 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45  le->lastErrno!=E
1b460 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f  NOSPC ){.      /
1b470 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
1b480 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
1b490 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1b4a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1b4b0 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
1b4c0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1b4d0 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f  rno(pFile, 0); /
1b4e0 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
1b4f0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rror */.      re
1b500 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1b510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1b520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b530 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1b540 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
1b550 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1b560 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
1b570 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
1b580 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
1b590 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
1b5a0 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
1b5b0 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
1b5c0 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
1b5d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1b5e0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1b5f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
1b600 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1b610 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
1b620 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
1b630 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
1b640 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
1b650 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
1b660 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
1b670 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
1b680 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
1b690 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79  th the (slightly
1b6a0 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e   slower).** fsyn
1b6b0 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77  c(). If you know
1b6c0 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65   that your syste
1b6d0 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66  m does support f
1b6e0 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65  datasync() corre
1b6f0 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69  ctly,.** then si
1b700 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74  mply compile wit
1b710 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64  h -Dfdatasync=fd
1b720 61 74 61 73 79 6e 63 20 6f 72 20 2d 44 48 41 56  atasync or -DHAV
1b730 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23  E_FDATASYNC.*/.#
1b740 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74  if !defined(fdat
1b750 61 73 79 6e 63 29 20 26 26 20 21 48 41 56 45 5f  async) && !HAVE_
1b760 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69  FDATASYNC.# defi
1b770 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
1b780 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
1b790 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
1b7a0 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
1b7b0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1b7c0 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
1b7d0 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
1b7e0 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
1b7f0 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
1b800 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
1b810 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
1b820 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
1b830 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
1b840 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
1b850 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
1b860 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1b870 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
1b880 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1b890 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
1b8a0 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
1b8b0 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
1b8c0 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
1b8d0 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
1b8e0 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
1b8f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
1b900 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
1b910 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
1b920 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
1b930 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1b940 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
1b950 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
1b960 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
1b970 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
1b980 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
1b990 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
1b9a0 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
1b9b0 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
1b9c0 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
1b9d0 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
1b9e0 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
1b9f0 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
1ba00 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
1ba10 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
1ba20 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
1ba30 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
1ba40 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
1ba50 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
1ba60 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
1ba70 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
1ba80 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
1ba90 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
1baa0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1bab0 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
1bac0 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
1bad0 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
1bae0 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
1baf0 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
1bb00 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
1bb10 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
1bb20 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
1bb30 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
1bb40 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1bb50 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
1bb60 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
1bb70 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
1bb80 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
1bb90 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
1bba0 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
1bbb0 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1bbc0 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
1bbd0 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
1bbe0 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
1bbf0 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
1bc00 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
1bc10 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
1bc20 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
1bc30 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
1bc40 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
1bc50 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
1bc60 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
1bc70 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
1bc80 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
1bc90 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
1bca0 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
1bcb0 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
1bcc0 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
1bcd0 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
1bce0 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
1bcf0 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
1bd00 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
1bd10 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
1bd20 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
1bd30 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
1bd40 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
1bd50 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
1bd60 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
1bd70 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
1bd80 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1bd90 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1bda0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bdb0 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
1bdc0 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
1bdd0 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
1bde0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1bdf0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
1be00 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
1be10 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
1be20 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
1be30 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
1be40 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
1be50 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
1be60 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
1be70 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
1be80 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
1be90 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
1bea0 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
1beb0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1bec0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
1bed0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1bee0 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1bef0 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1bf00 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1bf10 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1bf20 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1bf30 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1bf40 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1bf50 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
1bf60 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1bf70 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1bf80 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1bf90 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
1bfa0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
1bfb0 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
1bfc0 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
1bfd0 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
1bfe0 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
1bff0 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
1c000 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
1c010 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
1c020 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
1c030 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
1c040 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
1c050 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
1c060 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1c070 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
1c080 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1c090 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
1c0a0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
1c0b0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1c0c0 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
1c0d0 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
1c0e0 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
1c0f0 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
1c100 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
1c110 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1c120 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
1c130 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  OK;.#elif HAVE_F
1c140 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
1c150 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
1c160 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1c170 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1c180 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1c190 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1c1a0 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1c1b0 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1c1c0 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1c1d0 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1c1e0 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1c1f0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1c200 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1c210 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1c220 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1c230 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1c240 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1c250 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1c260 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1c270 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1c280 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1c290 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1c2a0 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1c2b0 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1c2c0 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1c2d0 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1c2e0 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1c2f0 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1c300 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1c310 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1c320 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1c330 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1c340 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1c350 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1c360 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1c370 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1c380 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1c390 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1c3a0 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1c3b0 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1c3c0 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1c3d0 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1c3e0 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1c3f0 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1c400 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1c410 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1c420 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1c430 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1c440 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1c450 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1c460 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1c470 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1c480 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1c490 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1c4a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1c4b0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1c4c0 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1c4d0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1c4e0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1c4f0 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1c500 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1c510 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1c520 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1c530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1c540 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1c550 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1c560 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1c570 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1c580 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1c590 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1c5a0 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1c5b0 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1c5c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1c5d0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1c5e0 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1c5f0 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1c600 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1c610 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1c620 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1c630 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1c640 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1c650 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1c660 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1c670 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1c680 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1c690 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1c6a0 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1c6b0 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1c6c0 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1c6d0 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1c6e0 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1c6f0 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1c700 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1c710 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1c720 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1c730 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1c740 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1c750 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1c760 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1c770 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1c780 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1c790 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1c7a0 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1c7b0 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1c7c0 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1c7d0 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1c7e0 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1c7f0 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1c800 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1c810 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1c820 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1c830 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1c840 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1c850 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1c860 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1c870 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1c880 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1c890 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1c8a0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1c8b0 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1c8c0 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1c8d0 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1c8e0 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1c8f0 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
1c900 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1c910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1c920 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c930 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1c940 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1c950 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1c960 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1c970 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1c980 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1c990 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1c9a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1c9b0 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1c9c0 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1c9d0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1c9e0 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1c9f0 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1ca00 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1ca10 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1ca20 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1ca30 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1ca40 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1ca50 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26  irname); ii>1 &&
1ca60 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1ca70 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1ca80 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1ca90 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1caa0 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
1cab0 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  t_open(zDirname,
1cac0 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
1cad0 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
1cae0 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  fd>=0 ){.      O
1caf0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52  STRACE(("OPENDIR
1cb00 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
1cb10 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20   zDirname));.   
1cb20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20   }.  }.  *pFd = 
1cb30 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64  fd;.  return (fd
1cb40 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e  >=0?SQLITE_OK:un
1cb50 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1cb60 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1cb70 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d   "open", zDirnam
1cb80 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  e));.}../*.** Ma
1cb90 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1cba0 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1cbb0 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1cbc0 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1cbd0 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
1cbe0 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
1cbf0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
1cc00 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
1cc10 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
1cc20 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
1cc30 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
1cc40 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
1cc50 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
1cc60 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
1cc70 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
1cc80 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
1cc90 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
1cca0 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1ccb0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
1ccc0 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
1ccd0 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
1cce0 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
1ccf0 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
1cd00 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
1cd10 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
1cd20 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
1cd30 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
1cd40 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
1cd50 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1cd60 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1cd70 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
1cd80 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
1cd90 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
1cda0 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
1cdb0 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
1cdc0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
1cdd0 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
1cde0 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1cdf0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
1ce00 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
1ce10 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
1ce20 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
1ce30 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
1ce40 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
1ce50 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1ce60 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
1ce70 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
1ce80 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1ce90 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
1cea0 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
1ceb0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1cec0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
1ced0 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
1cee0 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
1cef0 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
1cf00 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
1cf10 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1cf20 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
1cf30 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
1cf40 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
1cf50 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
1cf60 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
1cf70 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
1cf80 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1cf90 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
1cfa0 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
1cfb0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1cfc0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
1cfd0 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
1cfe0 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
1cff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1d000 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
1d010 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
1d020 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
1d030 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
1d040 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1d050 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1d060 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
1d070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1d080 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
1d090 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1d0a0 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
1d0b0 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
1d0c0 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
1d0d0 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
1d0e0 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
1d0f0 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
1d100 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1d110 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1d120 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1d130 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
1d140 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1d150 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1d160 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c  OERR_FSYNC, "ful
1d170 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d  l_fsync", pFile-
1d180 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20  >zPath);.  }..  
1d190 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68  /* Also fsync th
1d1a0 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1d1b0 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  aining the file 
1d1c0 69 66 20 74 68 65 20 44 49 52 53 59 4e 43 20 66  if the DIRSYNC f
1d1d0 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e  lag.  ** is set.
1d1e0 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d    This is a one-
1d1f0 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63 65 2e  time occurrence.
1d200 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28    Many systems (
1d210 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20  examples: AIX). 
1d220 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74   ** are unable t
1d230 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65 63 74  o fsync a direct
1d240 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65  ory, so ignore e
1d250 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79  rrors on the fsy
1d260 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nc..  */.  if( p
1d270 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1d280 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  & UNIXFILE_DIRSY
1d290 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69  NC ){.    int di
1d2a0 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rfd;.    OSTRACE
1d2b0 28 28 22 44 49 52 53 59 4e 43 20 25 73 20 28 68  (("DIRSYNC %s (h
1d2c0 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64  ave_fullfsync=%d
1d2d0 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22   fullsync=%d)\n"
1d2e0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a  , pFile->zPath,.
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45              HAVE
1d300 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75  _FULLFSYNC, isFu
1d310 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63  llsync));.    rc
1d320 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f   = osOpenDirecto
1d330 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  ry(pFile->zPath,
1d340 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66   &dirfd);.    if
1d350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d360 26 26 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  && dirfd>=0 ){. 
1d370 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28       full_fsync(
1d380 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  dirfd, 0, 0);.  
1d390 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
1d3a0 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f  (pFile, dirfd, _
1d3b0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65  _LINE__);.    }e
1d3c0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1d3d0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
1d3e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d3f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1d400 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1d410 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52  &= ~UNIXFILE_DIR
1d420 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SYNC;.  }.  retu
1d430 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d440 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
1d450 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
1d460 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
1d470 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
1d480 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
1d490 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
1d4a0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1d4b0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1d4c0 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b   *)id;.  int rc;
1d4d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1d4e0 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
1d4f0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1d500 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1d510 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ATE );..  /* If 
1d520 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
1d530 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
1d540 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
1d550 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
1d560 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
1d570 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
1d580 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
1d590 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
1d5a0 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
1d5b0 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
1d5c0 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
1d5d0 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
1d5e0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1d5f0 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
1d600 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
1d610 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1d620 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
1d630 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
1d640 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
1d650 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1d660 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
1d670 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72   rc = robust_ftr
1d680 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1d690 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72   nByte);.  if( r
1d6a0 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  c ){.    storeLa
1d6b0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
1d6c0 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  rrno);.    retur
1d6d0 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1d6e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1d6f0 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1d700 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1d710 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
1d720 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d730 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1d740 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
1d750 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
1d760 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
1d770 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  sed to.    ** do
1d780 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1d790 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1d7a0 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1d7b0 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1d7c0 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61      ** normal da
1d7d0 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64  tabase file) and
1d7e0 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65   we truncate the
1d7f0 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1d800 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61  ngth,.    ** tha
1d810 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70  t effectively up
1d820 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1d830 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
1d840 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20  might happen.   
1d850 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69   ** when restori
1d860 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73  ng a database us
1d870 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41  ing the backup A
1d880 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c  PI from a zero-l
1d890 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75  ength.    ** sou
1d8a0 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rce..    */.    
1d8b0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1d8c0 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74  malWrite && nByt
1d8d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  e==0 ){.      pF
1d8e0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1d8f0 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  ng = 1;.    }.#e
1d900 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1d910 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1d920 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
1d930 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75  ile was just tru
1d940 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65  ncated to a size
1d950 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1d960 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
1d970 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
1d980 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
1d990 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
1d9a0 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
1d9b0 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ite will.    ** 
1d9c0 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77  use read() and w
1d9d0 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73  rite() to access
1d9e0 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69   data beyond thi
1d9f0 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77  s point from now
1da00 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20   on.  .    */.  
1da10 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c    if( nByte<pFil
1da20 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1da30 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1da40 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Size = nByte;.  
1da50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1da60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1da70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1da80 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
1da90 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
1daa0 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
1dab0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1dac0 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1dad0 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  file *id, i64 *p
1dae0 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1daf0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
1db00 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
1db10 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74   );.  rc = osFst
1db20 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
1db30 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  d)->h, &buf);.  
1db40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1db50 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1db60 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72  c!=0 ){.    stor
1db70 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78  eLastErrno((unix
1db80 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29  File*)id, errno)
1db90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1dba0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1dbb0 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
1dbc0 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20  buf.st_size;..  
1dbd0 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  /* When opening 
1dbe0 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61  a zero-size data
1dbf0 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e  base, the findIn
1dc00 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64  odeInfo() proced
1dc10 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20  ure.  ** writes 
1dc20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1dc30 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20  to that file in 
1dc40 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72  order to work ar
1dc50 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20  ound a bug.  ** 
1dc60 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f  in the OS-X msdo
1dc70 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49  s filesystem.  I
1dc80 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1dc90 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75   problems with u
1dca0 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73  pper.  ** layers
1dcb0 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70  , we need to rep
1dcc0 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69  ort this file si
1dcd0 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20  ze as zero even 
1dce0 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a  though it is.  *
1dcf0 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69  * really 1.   Ti
1dd00 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f  cket #3260..  */
1dd10 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31  .  if( *pSize==1
1dd20 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a   ) *pSize = 0;..
1dd30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1dd40 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
1dd50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1dd60 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1dd70 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
1dd80 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20  .** Handler for 
1dd90 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69  proxy-locking fi
1dda0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73  le-control verbs
1ddb0 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77  .  Defined below
1ddc0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   in the.** proxy
1ddd0 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69  ing locking divi
1dde0 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
1ddf0 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
1de00 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1de10 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23  e*,int,void*);.#
1de20 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  endif../* .** Th
1de30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1de40 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  alled to handle 
1de50 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
1de60 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66  _SIZE_HINT .** f
1de70 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72  ile-control oper
1de80 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20  ation.  Enlarge 
1de90 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
1dea0 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a  nBytes in size.*
1deb0 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  * (rounded up to
1dec0 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d   the next chunk-
1ded0 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64  size).  If the d
1dee0 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1def0 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20  dy.** nBytes or 
1df00 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75  larger, this rou
1df10 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1df20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1df30 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69  cntlSizeHint(uni
1df40 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36  xFile *pFile, i6
1df50 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20  4 nByte){.  if( 
1df60 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
1df70 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a   ){.    i64 nSiz
1df80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1df90 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
1dfa0 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1dfb0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
1dfc0 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
1dfd0 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64   /* Used to hold
1dfe0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f   return values o
1dff0 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20  f fstat() */.   
1e000 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
1e010 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
1e020 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e030 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1e040 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  TAT;.    }..    
1e050 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1e060 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
1e070 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
1e080 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1e090 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
1e0a0 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
1e0b0 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
1e0c0 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1e0d0 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1e0e0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1e0f0 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
1e100 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
1e110 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
1e120 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
1e130 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
1e140 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
1e150 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
1e160 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
1e170 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
1e180 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
1e190 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
1e1a0 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
1e1b0 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
1e1c0 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
1e1d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
1e1e0 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1e1f0 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
1e200 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
1e210 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1e220 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
1e230 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
1e240 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
1e250 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
1e260 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1e270 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
1e280 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
1e290 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
1e2a0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1e2b0 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69 74 65  , fake it. Write
1e2c0 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e   a .      ** sin
1e2d0 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20  gle byte to the 
1e2e0 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63  last byte in eac
1e2f0 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c  h block that fal
1e300 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20 20 20  ls entirely.    
1e310 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20    ** within the 
1e320 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e  extended region.
1e330 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75 69 72   Then, if requir
1e340 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ed, a single byt
1e350 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  e.      ** at of
1e360 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20  fset (nSize-1), 
1e370 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20  to set the size 
1e380 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 72 72  of the file corr
1e390 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20  ectly..      ** 
1e3a0 54 68 69 73 20 69 73 20 61 20 73 69 6d 69 6c 61  This is a simila
1e3b0 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f 20 74  r technique to t
1e3c0 68 61 74 20 75 73 65 64 20 62 79 20 67 6c 69 62  hat used by glib
1e3d0 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20 20  c on systems.   
1e3e0 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f     ** that do no
1e3f0 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61  t have a real fa
1e400 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a  llocate() call..
1e410 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1e420 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74  nt nBlk = buf.st
1e430 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69  _blksize;  /* Fi
1e440 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20  le-system block 
1e450 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  size */.      in
1e460 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20  t nWrite = 0;   
1e470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e480 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
1e490 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e 64 57  tten by seekAndW
1e4a0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  rite */.      i6
1e4b0 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20  4 iWrite;       
1e4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
1e4d0 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74  t offset to writ
1e4e0 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69  e to */..      i
1e4f0 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74  Write = ((buf.st
1e500 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d  _size + 2*nBlk -
1e510 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31   1)/nBlk)*nBlk-1
1e520 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e530 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74 5f 73  iWrite>=buf.st_s
1e540 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
1e550 65 72 74 28 20 28 69 57 72 69 74 65 2f 6e 42 6c  ert( (iWrite/nBl
1e560 6b 29 3d 3d 28 28 62 75 66 2e 73 74 5f 73 69 7a  k)==((buf.st_siz
1e570 65 2b 6e 42 6c 6b 2d 31 29 2f 6e 42 6c 6b 29 20  e+nBlk-1)/nBlk) 
1e580 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e590 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e 42 6c   ((iWrite+1)%nBl
1e5a0 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  k)==0 );.      f
1e5b0 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57  or(/*no-op*/; iW
1e5c0 72 69 74 65 3c 6e 53 69 7a 65 3b 20 69 57 72 69  rite<nSize; iWri
1e5d0 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20  te+=nBlk ){.    
1e5e0 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65 65      nWrite = see
1e5f0 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1e600 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b   iWrite, "", 1);
1e610 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72  .        if( nWr
1e620 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20  ite!=1 ) return 
1e630 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1e640 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
1e650 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20    if( nWrite==0 
1e660 7c 7c 20 28 6e 53 69 7a 65 25 6e 42 6c 6b 29 20  || (nSize%nBlk) 
1e670 29 7b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74  ){.        nWrit
1e680 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1e690 28 70 46 69 6c 65 2c 20 6e 53 69 7a 65 2d 31 2c  (pFile, nSize-1,
1e6a0 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   "", 1);.       
1e6b0 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29   if( nWrite!=1 )
1e6c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e6d0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1e6e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1e6f0 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
1e700 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1e710 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d  .  if( pFile->mm
1e720 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e  apSizeMax>0 && n
1e730 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte>pFile->mmap
1e740 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Size ){.    int 
1e750 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  rc;.    if( pFil
1e760 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b  e->szChunk<=0 ){
1e770 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73  .      if( robus
1e780 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1e790 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a  e->h, nByte) ){.
1e7a0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
1e7b0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
1e7c0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65  rno);.        re
1e7d0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1e7e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1e7f0 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1e800 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1e810 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
1e820 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   }..    rc = uni
1e830 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20  xMapfile(pFile, 
1e840 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75  nByte);.    retu
1e850 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
1e860 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  f..  return SQLI
1e870 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1e880 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74  If *pArg is init
1e890 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74  ially negative t
1e8a0 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75  hen this is a qu
1e8b0 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20  ery.  Set *pArg 
1e8c0 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70  to.** 1 or 0 dep
1e8d0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
1e8e0 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73  r or not bit mas
1e8f0 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  k of pFile->ctrl
1e900 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a  Flags is set..**
1e910 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
1e920 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65  0 or 1, then cle
1e930 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61  ar or set the ma
1e940 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d  sk bit of pFile-
1e950 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73  >ctrlFlags..*/.s
1e960 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d  tatic void unixM
1e970 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20  odeBit(unixFile 
1e980 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  *pFile, unsigned
1e990 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20   char mask, int 
1e9a0 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70  *pArg){.  if( *p
1e9b0 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41  Arg<0 ){.    *pA
1e9c0 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72  rg = (pFile->ctr
1e9d0 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d  lFlags & mask)!=
1e9e0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
1e9f0 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  *pArg)==0 ){.   
1ea00 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1ea10 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65  s &= ~mask;.  }e
1ea20 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
1ea30 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73  ctrlFlags |= mas
1ea40 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72  k;.  }.}../* For
1ea50 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1ea60 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75   */.static int u
1ea70 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69  nixGetTempname(i
1ea80 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
1ea90 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66  Buf);../*.** Inf
1eaa0 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e  ormation and con
1eab0 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20  trol of an open 
1eac0 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
1ead0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1eae0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1eaf0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1eb00 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
1eb10 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1eb20 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1eb30 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  )id;.  switch( o
1eb40 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
1eb50 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 41 4c 5f 42  LITE_FCNTL_WAL_B
1eb60 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LOCK: {.      /*
1eb70 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1eb80 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 42 4c  s |= UNIXFILE_BL
1eb90 4f 43 4b 3b 20 2f 2f 20 44 65 66 65 72 72 65 64  OCK; // Deferred
1eba0 20 66 65 61 74 75 72 65 20 2a 2f 0a 20 20 20 20   feature */.    
1ebb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ebc0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1ebd0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ebe0 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
1ebf0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1ec00 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1ec10 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
1ec20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ec30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ec40 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e  _FCNTL_LAST_ERRN
1ec50 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
1ec60 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1ec70 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
1ec80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ec90 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1eca0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
1ecb0 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
1ecc0 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
1ecd0 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
1ece0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1ecf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1ed00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ed10 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
1ed20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
1ed30 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1ed40 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1ed50 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74  .      rc = fcnt
1ed60 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c  lSizeHint(pFile,
1ed70 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a   *(i64 *)pArg);.
1ed80 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1ed90 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1eda0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1edb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1edc0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
1edd0 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
1ede0 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
1edf0 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45  ile, UNIXFILE_PE
1ee00 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
1ee10 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
1ee20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ee30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1ee40 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
1ee50 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
1ee60 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
1ee70 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
1ee80 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
1ee90 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
1eea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1eeb0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1eec0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
1eed0 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
1eee0 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
1eef0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1ef00 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  ", pFile->pVfs->
1ef10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
1ef20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ef30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1ef40 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
1ef50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
1ef60 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
1ef70 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1ef80 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78   pFile->pVfs->mx
1ef90 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Pathname );.    
1efa0 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a    if( zTFile ){.
1efb0 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74 54          unixGetT
1efc0 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  empname(pFile->p
1efd0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
1efe0 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20   zTFile);.      
1eff0 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1f000 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20  = zTFile;.      
1f010 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
1f020 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1f030 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f040 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a  FCNTL_HAS_MOVED:
1f050 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1f060 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f  pArg = fileHasMo
1f070 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ved(pFile);.    
1f080 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f090 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  OK;.    }.#if SQ
1f0a0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1f0b0 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
1f0c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
1f0d0 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
1f0e0 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
1f0f0 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
1f100 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f110 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  OK;.      if( ne
1f120 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c  wLimit>sqlite3Gl
1f130 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
1f140 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  p ){.        new
1f150 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47  Limit = sqlite3G
1f160 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
1f170 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ap;.      }.    
1f180 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
1f190 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1f1a0 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
1f1b0 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
1f1c0 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
1f1d0 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
1f1e0 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
1f1f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1f200 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
1f210 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
1f220 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
1f230 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
1f240 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
1f250 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ile(pFile);.    
1f260 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d        rc = unixM
1f270 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
1f280 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f290 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1f2a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
1f2b0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1f2c0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
1f2d0 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68  e pager calls th
1f2e0 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67  is method to sig
1f2f0 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20  nal that it has 
1f300 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f  done.    ** a ro
1f310 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  llback and that 
1f320 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1f330 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e  therefore unchan
1f340 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ged and.    ** i
1f350 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b  t hence it is OK
1f360 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63   for the transac
1f370 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e  tion change coun
1f380 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  ter to be.    **
1f390 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20   unchanged..    
1f3a0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1f3b0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1f3c0 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28  ANGED: {.      (
1f3d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1f3e0 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
1f3f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f400 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
1f410 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
1f420 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1f430 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1f440 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
1f450 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1f460 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1f470 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
1f480 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b  E_FCNTL_GET_LOCK
1f490 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
1f4a0 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
1f4b0 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
1f4c0 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
1f4d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1f4e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f4f0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1f500 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
1f510 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f520 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1f530 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1f540 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1f550 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1f560 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1f570 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1f580 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1f590 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1f5a0 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1f5b0 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1f5c0 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1f5d0 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1f5e0 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1f5f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1f600 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1f610 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1f620 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1f630 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1f640 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1f650 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1f660 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1f670 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1f680 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1f690 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1f6a0 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1f6b0 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69   for both..*/.#i
1f6c0 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  fndef __QNXNTO__
1f6d0 20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69   .static int uni
1f6e0 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
1f6f0 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
1f700 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
1f710 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1f720 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f730 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
1f740 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  SIZE;.}.#endif..
1f750 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1f760 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75  ing version of u
1f770 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  nixSectorSize() 
1f780 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72  is optimized for
1f790 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   QNX..*/.#ifdef 
1f7a0 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c  __QNXNTO__.#incl
1f7b0 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c  ude <sys/dcmd_bl
1f7c0 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  k.h>.#include <s
1f7d0 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74  ys/statvfs.h>.st
1f7e0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
1f7f0 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1f800 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
1f810 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1f820 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1f830 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  if( pFile->secto
1f840 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20  rSize == 0 ){.  
1f850 20 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73    struct statvfs
1f860 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20   fsInfo;.       
1f870 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61  .    /* Set defa
1f880 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70  ults for non-sup
1f890 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65  ported filesyste
1f8a0 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ms */.    pFile-
1f8b0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51  >sectorSize = SQ
1f8c0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1f8d0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46  TOR_SIZE;.    pF
1f8e0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f8f0 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
1f900 20 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73      if( fstatvfs
1f910 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e  (pFile->h, &fsIn
1f920 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20  fo) == -1 ) {.  
1f930 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65      return pFile
1f940 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
1f950 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74    }..    if( !st
1f960 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rcmp(fsInfo.f_ba
1f970 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29  setype, "tmp") )
1f980 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1f990 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1f9a0 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1f9b0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1f9c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f9d0 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
1f9e0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20  _IOCAP_ATOMIC4K 
1f9f0 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72  |       /* All r
1fa00 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72  am filesystem wr
1fa10 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1fa20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1fa30 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1fa40 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
1fa50 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
1fa60 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
1fa70 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
1faa0 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
1fab0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1fac0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1fad0 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
1fae0 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
1faf0 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
1fb00 0a 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 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
1fb30 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
1fb40 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
1fb50 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
1fb60 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1fb70 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20   "etfs") ){.    
1fb80 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1fb90 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1fba0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1fbb0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1fbc0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1fbd0 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74     /* etfs clust
1fbe0 65 72 20 73 69 7a 65 20 77 72 69 74 65 73 20 61  er size writes a
1fbf0 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
1fc00 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63       (pFile->sec
1fc10 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1fc20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1fc30 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20  MIC512) |.      
1fc40 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1fc50 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1fc60 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1fc70 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1fc80 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1fcb0 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1fcc0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1fcd0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1fce0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1fcf0 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1fd00 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1fd10 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1fd40 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1fd50 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1fd60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
1fd70 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
1fd80 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29  asetype, "qnx6")
1fd90 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1fda0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1fdb0 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1fdc0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1fdd0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fde0 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
1fdf0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c  E_IOCAP_ATOMIC |
1fe00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
1fe10 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65  filesystem write
1fe20 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
1fe30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1fe40 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1fe50 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1fe60 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1fe70 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1feb0 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1fec0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1fed0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1fee0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1fef0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1ff00 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff30 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1ff40 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1ff50 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1ff60 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1ff70 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1ff80 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx4") ){.      
1ff90 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1ffa0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1ffb0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1ffc0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1ffd0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1ffe0 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20   /* full bitset 
1fff0 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20  of atomics from 
20000 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20  max sector size 
20010 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20  and smaller */. 
20020 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e         ((pFile->
20030 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
20040 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
20050 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29  ATOMIC512) << 1)
20060 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53   - 2 |.        S
20070 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
20080 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
20090 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
200a0 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
200b0 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
200e0 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
200f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
20100 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
20110 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
20120 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b  etype, "dos") ){
20130 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
20140 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
20150 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
20160 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
20170 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
20180 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
20190 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
201a0 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
201b0 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
201c0 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
201d0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
201e0 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
201f0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
20200 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
20210 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20220 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
20230 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
20240 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
20250 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
20290 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
202a0 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     0;.    }else{
202b0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
202c0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
202d0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
202e0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
202f0 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62  C512 |      /* b
20300 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63  locks are atomic
20310 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
20320 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
20330 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
20340 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
20350 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
20360 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
20390 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
203a0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
203b0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74   }.  }.  /* Last
203c0 20 63 68 61 6e 63 65 20 76 65 72 69 66 69 63 61   chance verifica
203d0 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
203e0 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20  ctor size isn't 
203f0 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31  a multiple of 51
20400 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  2.  ** then it i
20410 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20  sn't valid.*/.  
20420 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  if( pFile->secto
20430 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30  rSize % 512 != 0
20440 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
20450 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20460 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46  tics = 0;.    pF
20470 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20480 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
20490 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
204a0 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  }.  return pFile
204b0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a  ->sectorSize;.}.
204c0 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e  #endif /* __QNXN
204d0 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TO__ */../*.** R
204e0 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
204f0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
20500 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a   for the file..*
20510 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73  *.** This VFS is
20520 20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75 72   set up to retur
20530 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  n SQLITE_IOCAP_P
20540 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
20550 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a  TE by default..*
20560 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
20570 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 6f  choice is contro
20580 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65  versial since te
20590 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e  chnically the un
205a0 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65  derlying.** file
205b0 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
205c0 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20   always provide 
205d0 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77 72  powersafe overwr
205e0 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72  ites.  (In other
205f0 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72  .** words, after
20600 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76   a power-loss ev
20610 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68  ent, parts of th
20620 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65  e file that were
20630 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65   never.** writte
20640 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  n might end up b
20650 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20  eing altered.)  
20660 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f  However, non-PSO
20670 57 20 62 65 68 61 76 69 6f 72 20 69 73 20 76 65  W behavior is ve
20680 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65  ry,.** very rare
20690 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67  .  And asserting
206a0 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61   PSOW makes a la
206b0 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e  rge reduction in
206c0 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f   the amount.** o
206d0 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66  f required I/O f
206e0 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73  or journaling, s
206f0 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61  ince a lot of pa
20700 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61  dding is elimina
20710 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20  ted..**  Hence, 
20720 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f  while POWERSAFE_
20730 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20  OVERWRITE is on 
20740 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72  by default, ther
20750 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74  e is a file-cont
20760 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  rol.** available
20770 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20   to turn it off 
20780 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61  and URI query pa
20790 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c  rameter availabl
207a0 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66  e to turn it off
207b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
207c0 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
207d0 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
207e0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
207f0 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
20800 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
20810 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66  t rc = 0;.#ifdef
20820 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66   __QNXNTO__.  if
20830 28 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d  ( p->sectorSize=
20840 3d 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53  =0 ) unixSectorS
20850 69 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20  ize(id);.  rc = 
20860 70 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  p->deviceCharact
20870 65 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66  eristics;.#endif
20880 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c  .  if( p->ctrlFl
20890 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50  ags & UNIXFILE_P
208a0 53 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d  SOW ){.    rc |=
208b0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
208c0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
208d0 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
208e0 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
208f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
20900 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
20910 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a  AX_MMAP_SIZE>0..
20920 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
20930 20 73 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a   system page siz
20940 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e..**.** This fu
20950 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
20960 74 20 62 65 20 63 61 6c 6c 65 64 20 64 69 72 65  t be called dire
20970 63 74 6c 79 20 62 79 20 6f 74 68 65 72 20 63 6f  ctly by other co
20980 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  de in this file.
20990 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74   .** Instead, it
209a0 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
209b0 64 20 76 69 61 20 6d 61 63 72 6f 20 6f 73 47 65  d via macro osGe
209c0 74 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a  tpagesize()..*/.
209d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
209e0 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29  etpagesize(void)
209f0 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
20a00 0a 20 20 72 65 74 75 72 6e 20 31 30 32 34 3b 0a  .  return 1024;.
20a10 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 42  #elif defined(_B
20a20 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72 65 74  SD_SOURCE).  ret
20a30 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a 65 28  urn getpagesize(
20a40 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  );.#else.  retur
20a50 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66 28 5f  n (int)sysconf(_
20a60 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a 23 65  SC_PAGESIZE);.#e
20a70 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  ndif.}..#endif /
20a80 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
20a90 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
20aa0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
20ab0 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e 64 65  IZE>0 */..#ifnde
20ac0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
20ad0 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  L../*.** Object 
20ae0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
20af0 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  t an shared memo
20b00 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a  ry buffer.  .**.
20b10 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ** When multiple
20b20 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
20b30 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20  erence the same 
20b40 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20  wal-index, each 
20b50 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74  thread.** has it
20b60 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62  s own unixShm ob
20b70 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
20b80 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ll point to a si
20b90 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  ngle instance.**
20ba0 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d   of this unixShm
20bb0 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e  Node object.  In
20bc0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
20bd0 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20  ch wal-index is 
20be0 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f  opened.** only o
20bf0 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
20c00 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78  .**.** Each unix
20c10 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
20c20 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
20c30 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64   single unixInod
20c40 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a  eInfo object..**
20c50 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73   We could coales
20c60 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  ce this object i
20c70 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nto unixInodeInf
20c80 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c  o, but that woul
20c90 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20  d mean.** every 
20ca0 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64  open file that d
20cb0 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72  oes not use shar
20cc0 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74  ed memory (in ot
20cd0 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a  her words, most.
20ce0 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77  ** open files) w
20cf0 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72  ould have to car
20d00 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65  ry around this e
20d10 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
20d20 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69  .  So.** the uni
20d30 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
20d40 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
20d50 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69  nter to this uni
20d60 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a  xShmNode object.
20d70 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53  ** and the unixS
20d80 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
20d90 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68   created only wh
20da0 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  en needed..**.**
20db0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
20dc0 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
20dd0 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
20de0 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
20df0 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
20e00 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
20e10 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
20e20 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
20e30 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a        nRef.**.**
20e40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
20e50 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
20e60 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
20e70 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
20e80 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
20e90 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
20ea0 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
20eb0 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65  unixShmNode.mute
20ec0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
20ed0 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  r unixShmNode.nR
20ee0 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69  ef==0 and.** uni
20ef0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
20f00 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
20f10 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
20f20 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
20f30 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
20f40 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  e..*/.struct uni
20f50 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69  xShmNode {.  uni
20f60 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
20f70 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49  de;     /* unixI
20f80 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77  nodeInfo that ow
20f90 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65  ns this SHM node
20fa0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
20fb0 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
20fc0 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
20fd0 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
20fe0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
20ff0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
21000 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
21010 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
21020 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
21030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21040 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
21050 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  tor */.  int szR
21060 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
21070 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
21080 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
21090 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52  ions */.  u16 nR
210a0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
210b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
210c0 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
210d0 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c  /.  u8 isReadonl
210e0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
210f0 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f  * True if read-o
21100 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nly */.  char **
21110 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
21120 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
21130 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65  mapped shared-me
21140 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
21150 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21170 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68  Number of unixSh
21180 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
21190 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
211a0 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b  unixShm *pFirst;
211b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
211c0 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  l unixShm object
211d0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
211e0 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  is */.#ifdef SQL
211f0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65  ITE_DEBUG.  u8 e
21200 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
21210 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
21220 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
21230 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73  s held */.  u8 s
21240 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
21250 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
21260 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
21270 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74  eld */.  u8 next
21280 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
21290 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
212a0 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64  lable unixShm.id
212b0 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
212c0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .};../*.** Struc
212d0 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
212e0 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
212f0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
21300 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
21310 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
21320 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
21330 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
21340 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
21350 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
21360 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
21370 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
21380 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
21390 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e  ter:.**.**    un
213a0 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20  ixShm.pFile.**  
213b0 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
213c0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
213d0 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
213e0 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
213f0 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
21400 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
21410 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
21420 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
21430 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  lds..*/.struct u
21440 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53  nixShm {.  unixS
21450 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
21460 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  ;     /* The und
21470 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e  erlying unixShmN
21480 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
21490 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20  unixShm *pNext; 
214a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
214b0 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20  xt unixShm with 
214c0 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d  the same unixShm
214d0 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
214e0 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
214f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
21500 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
21510 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
21520 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21540 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
21550 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
21560 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
21570 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
21580 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
21590 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
215a0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
215b0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
215c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
215d0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
215e0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b  locks held */.};
215f0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
21600 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
21610 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng.*/.#define UN
21620 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IX_SHM_BASE   ((
21630 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
21640 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20  OCK)*4)         
21650 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
21660 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  te */.#define UN
21670 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55  IX_SHM_DMS    (U
21680 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  NIX_SHM_BASE+SQL
21690 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
216a0 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
216b0 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
216c0 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  y posix advisory
216d0 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62   locks for all b
216e0 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74  ytes from ofst t
216f0 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e  hrough ofst+n-1.
21700 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f  .**.** Locks blo
21710 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69  ck if the mask i
21720 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53  s exactly UNIX_S
21730 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e  HM_C and are non
21740 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68  -blocking.** oth
21750 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
21760 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73  c int unixShmSys
21770 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46  temLock(.  unixF
21780 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
21790 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63    /* Open connec
217a0 74 69 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c 20  tion to the WAL 
217b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  file */.  int lo
217c0 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
217d0 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52   /* F_UNLCK, F_R
217e0 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b  DLCK, or F_WRLCK
217f0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21810 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
21820 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
21830 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20  */.  int n      
21840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21850 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
21860 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  o lock */.){.  u
21870 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
21880 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c  Node; /* Apply l
21890 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
218a0 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
218b0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72  segment */.  str
218c0 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
218d0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78      /* The posix
218e0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e   advisory lockin
218f0 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
21900 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21910 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c  _OK;    /* Resul
21920 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74  t code form fcnt
21930 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  l() */..  /* Acc
21940 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
21950 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
21960 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
21970 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70  he caller */.  p
21980 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  ShmNode = pFile-
21990 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
219a0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
219b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
219c0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
219d0 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
219e0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  ef==0 );..  /* S
219f0 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
21a00 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
21a10 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
21a20 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
21a30 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
21a40 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
21a50 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
21a60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
21a70 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53  =1 && n<SQLITE_S
21a80 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  HM_NLOCK );..  i
21a90 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
21aa0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 54  0 ){.    int lkT
21ab0 79 70 65 3b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  ype;.    /* Init
21ac0 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
21ad0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
21ae0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  .    memset(&f, 
21af0 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
21b00 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f     f.l_type = lo
21b10 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f  ckType;.    f.l_
21b20 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
21b30 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74  T;.    f.l_start
21b40 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c   = ofst;.    f.l
21b50 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6c  _len = n;..    l
21b60 6b 54 79 70 65 20 3d 20 28 70 46 69 6c 65 2d 3e  kType = (pFile->
21b70 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
21b80 46 49 4c 45 5f 42 4c 4f 43 4b 29 21 3d 30 20 3f  FILE_BLOCK)!=0 ?
21b90 20 46 5f 53 45 54 4c 4b 57 20 3a 20 46 5f 53 45   F_SETLKW : F_SE
21ba0 54 4c 4b 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  TLK;.    rc = os
21bb0 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fcntl(pShmNode->
21bc0 68 2c 20 6c 6b 54 79 70 65 2c 20 26 66 29 3b 0a  h, lkType, &f);.
21bd0 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d      rc = (rc!=(-
21be0 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  1)) ? SQLITE_OK 
21bf0 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
21c00 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
21c10 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45  ags &= ~UNIXFILE
21c20 5f 42 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  _BLOCK;.  }..  /
21c30 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
21c40 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
21c50 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
21c60 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
21c70 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
21c80 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
21c90 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
21ca0 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74  );.  mask = ofst
21cb0 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28  >31 ? 0xffff : (
21cc0 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
21cd0 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20  1<<ofst);.  if( 
21ce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21cf0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
21d00 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
21d10 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
21d20 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
21d30 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
21d40 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
21d50 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
21d60 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
21d70 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
21d80 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
21d90 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
21da0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21db0 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  read-lock %d ok"
21dc0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
21dd0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
21de0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
21df0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
21e00 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
21e10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21e20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
21e30 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
21e40 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
21e50 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  rite-lock %d ok"
21e60 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
21e70 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
21e80 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
21e90 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
21ea0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
21eb0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21ec0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
21ed0 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
21ee0 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
21ef0 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
21f00 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ofst));.    }els
21f10 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
21f20 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
21f30 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
21f40 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a  lock failed"));.
21f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21f60 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
21f70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
21f80 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
21f90 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ite-lock %d fail
21fa0 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
21fb0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
21fc0 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73  ((" - afterwards
21fd0 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
21fe0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
21ff0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20  de->sharedMask, 
22000 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
22010 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sk));.  }.#endif
22020 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
22030 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20        .}../*.** 
22040 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d  Return the minim
22050 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b  um number of 32K
22060 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68  B shm regions th
22070 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70  at should be map
22080 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65  ped at.** a time
22090 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
220a0 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73  each mapping mus
220b0 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  t be an integer 
220c0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a  multiple of the.
220d0 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73 74 65  ** current syste
220e0 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a  m page-size..**.
220f0 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  ** Usually, this
22100 20 69 73 20 31 2e 20 54 68 65 20 65 78 63 65 70   is 1. The excep
22110 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65  tion seems to be
22120 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
22130 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20  e configured.** 
22140 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61 67 65  to use 64KB page
22150 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65  s - in this case
22160 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75   each mapping mu
22170 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73  st cover at leas
22180 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67  t two.** shm reg
22190 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
221a0 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  int unixShmRegio
221b0 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20  nPerMap(void){. 
221c0 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a   int shmsz = 32*
221d0 31 30 32 34 3b 20 20 20 20 20 20 20 20 20 20 20  1024;           
221e0 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73   /* SHM region s
221f0 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73  ize */.  int pgs
22200 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a  z = osGetpagesiz
22210 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d  e();   /* System
22220 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
22230 61 73 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31  assert( ((pgsz-1
22240 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20  )&pgsz)==0 );   
22250 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73  /* Page size mus
22260 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
22270 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c  2 */.  if( pgsz<
22280 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31  shmsz ) return 1
22290 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f  ;.  return pgsz/
222a0 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  shmsz;.}../*.** 
222b0 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
222c0 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
222d0 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
222e0 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
222f0 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
22300 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
22310 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
22320 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
22330 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
22340 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
22350 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
22360 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
22370 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
22380 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
22390 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
223a0 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
223b0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
223c0 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
223d0 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
223e0 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20  p && p->nRef==0 
223f0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d 50  ){.    int nShmP
22400 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
22410 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
22420 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
22430 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d  sert( p->pInode=
22440 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  =pFd->pInode );.
22450 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
22460 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
22470 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22480 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d  <p->nRegion; i+=
22490 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20  nShmPerMap){.   
224a0 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
224b0 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d  {.        osMunm
224c0 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ap(p->apRegion[i
224d0 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b  ], p->szRegion);
224e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
224f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22500 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ee(p->apRegion[i
22510 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
22520 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
22530 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b  ee(p->apRegion);
22540 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30  .    if( p->h>=0
22550 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
22560 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68  _close(pFd, p->h
22570 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
22580 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20     p->h = -1;.  
22590 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64    }.    p->pInod
225a0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e->pShmNode = 0;
225b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
225c0 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
225d0 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64  ** Open a shared
225e0 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
225f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65  ociated with ope
22600 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
22610 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73  pDbFd.  .** This
22620 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c   particular impl
22630 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
22640 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a  mmapped files..*
22650 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73  *.** The file us
22660 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
22670 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73  shared-memory is
22680 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
22690 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65  ectory.** as the
226a0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
226b0 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20  ile and has the 
226c0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
226d0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
226e0 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  * file with the 
226f0 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64  "-shm" suffix ad
22700 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ded.  For exampl
22710 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  e, if the databa
22720 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f  se file.** is "/
22730 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
22740 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66  g.db" then the f
22750 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61  ile that is crea
22760 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a  ted and mmapped.
22770 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  ** for shared me
22780 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c  mory will be cal
22790 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31  led "/home/user1
227a0 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e  /config.db-shm".
227b0 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72    .**.** Another
227c0 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20   approach to is 
227d0 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20  to use files in 
227e0 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76  /dev/shm or /dev
227f0 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f  /tmp or an.** so
22800 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d  me other tmpfs m
22810 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66  ount. But if a f
22820 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65  ile in a differe
22830 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  nt directory.** 
22840 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
22850 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20  e file is used, 
22860 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61  then differing a
22870 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
22880 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74  s.** or a chroot
22890 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74  () might cause t
228a0 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f  wo different pro
228b0 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61  cesses on the sa
228c0 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  me.** database t
228d0 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64  o end up using d
228e0 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66  ifferent files f
228f0 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
22900 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74   - .** meaning t
22910 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  hat their memory
22920 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c   would not reall
22930 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65  y be shared - re
22940 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61  sulting.** in da
22950 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
22960 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  n.  Nevertheless
22970 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c  , this tmpfs fil
22980 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62  e usage.** can b
22990 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  e enabled at com
229a0 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20  pile-time using 
229b0 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  -DSQLITE_SHM_DIR
229c0 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d  ECTORY="/dev/shm
229d0 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69  ".** or the equi
229e0 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65  valent.  The use
229f0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   of the SQLITE_S
22a00 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
22a10 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74  pile-time.** opt
22a20 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ion results in a
22a30 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62  n incompatible b
22a40 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20  uild of SQLite; 
22a50 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74   builds of SQLit
22a60 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64  e.** that with d
22a70 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f  iffering SQLITE_
22a80 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65  SHM_DIRECTORY se
22a90 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74  ttings attempt t
22aa0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d  o use the.** sam
22ab0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22ac0 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
22ad0 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  , database corru
22ae0 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c  ption will likel
22af0 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65  y.** result. The
22b00 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22b10 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
22b20 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e  me option is con
22b30 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75  sidered.** "unsu
22b40 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79  pported" and may
22b50 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75   go away in a fu
22b60 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65  ture SQLite rele
22b70 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ase..**.** When 
22b80 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
22b90 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
22ba0 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
22bb0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
22bc0 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
22bd0 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
22be0 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
22bf0 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
22c00 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
22c10 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
22c20 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
22c30 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
22c40 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
22c50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72  .**.** If the or
22c60 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
22c70 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20  file (pDbFd) is 
22c80 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d  using the "unix-
22c90 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61  excl" VFS.** tha
22ca0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20  t means that an 
22cb0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
22cc0 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
22cd0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a  tabase file and.
22ce0 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ** that no other
22cf0 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61   processes are a
22d00 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ble to read or w
22d10 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
22d20 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63  e.  In.** that c
22d30 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72  ase, we do not r
22d40 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65  eally need share
22d50 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68  d memory.  No sh
22d60 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  ared memory.** f
22d70 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ile is created. 
22d80 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
22d90 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c  ry will be simul
22da0 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d  ated with heap m
22db0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
22dc0 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61   int unixOpenSha
22dd0 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69  redMemory(unixFi
22de0 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
22df0 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20  ruct unixShm *p 
22e00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
22e10 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
22e20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
22e30 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
22e40 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
22e50 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
22e60 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
22e70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
22ea0 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  code */.  unixIn
22eb0 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
22ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22ed0 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a   inode of fd */.
22ee0 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65    char *zShmFile
22ef0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
22f00 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
22f10 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53   file used for S
22f20 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d  HM */.  int nShm
22f30 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
22f40 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
22f50 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e  of the SHM filen
22f60 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
22f70 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
22f80 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
22f90 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e   unixShm object.
22fa0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
22fb0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
22fc0 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
22fd0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
22fe0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
22ff0 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
23000 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *p));.  assert( 
23010 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
23020 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
23030 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53 68   see if a unixSh
23040 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72  mNode object alr
23050 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65 75  eady exists. Reu
23060 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  se an existing. 
23070 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65   ** one if prese
23080 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77  nt. Create a new
23090 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
230a0 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  y..  */.  unixEn
230b0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
230c0 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
230d0 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  node;.  pShmNode
230e0 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e   = pInode->pShmN
230f0 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  ode;.  if( pShmN
23100 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ode==0 ){.    st
23110 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23130 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f   /* fstat() info
23140 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69   for database fi
23150 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le */.#ifndef SQ
23160 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
23170 52 59 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  RY.    const cha
23180 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d 20 70  r *zBasePath = p
23190 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e  DbFd->zPath;.#en
231a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  dif..    /* Call
231b0 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75   fstat() to figu
231c0 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69  re out the permi
231d0 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61  ssions on the da
231e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
231f0 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73      ** a new *-s
23200 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  hm file is creat
23210 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77  ed, an attempt w
23220 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63  ill be made to c
23230 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  reate it.    ** 
23240 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65  with the same pe
23250 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a  rmissions..    *
23260 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
23270 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74  t(pDbFd->h, &sSt
23280 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62  at) && pInode->b
23290 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
232a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
232b0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
232c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
232d0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
232e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
232f0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
23300 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
23310 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
23320 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
23330 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  1;.#else.    nSh
23340 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20  mFilename = 6 + 
23350 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73  (int)strlen(zBas
23360 65 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ePath);.#endif. 
23370 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71     pShmNode = sq
23380 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
23390 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
233a0 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29  + nShmFilename )
233b0 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
233c0 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
233d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
233e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
233f0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
23400 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d  .    memset(pShm
23410 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Node, 0, sizeof(
23420 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46  *pShmNode)+nShmF
23430 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53  ilename);.    zS
23440 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68  hmFilename = pSh
23450 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
23460 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e   = (char*)&pShmN
23470 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53  ode[1];.#ifdef S
23480 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
23490 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ORY.    sqlite3_
234a0 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
234b0 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
234c0 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
234d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
234e0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
234f0 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d  "/sqlite-shm-%x-
23500 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %x",.           
23510 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73            (u32)s
23520 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33  Stat.st_ino, (u3
23530 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b  2)sStat.st_dev);
23540 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74  .#else.    sqlit
23550 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
23560 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
23570 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
23580 2c 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20  , zBasePath);.  
23590 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
235a0 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
235b0 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  h, zShmFilename)
235c0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
235d0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  mNode->h = -1;. 
235e0 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65     pDbFd->pInode
235f0 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
23600 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  mNode;.    pShmN
23610 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44  ode->pInode = pD
23620 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20  bFd->pInode;.   
23630 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
23640 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
23650 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
23660 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
23670 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
23680 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
23690 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
236a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
236b0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
236c0 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ..    if( pInode
236d0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
236e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
236f0 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
23700 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20  R | O_CREAT;.   
23710 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75     if( sqlite3_u
23720 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64  ri_boolean(pDbFd
23730 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e  ->zPath, "readon
23740 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20  ly_shm", 0) ){. 
23750 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
23760 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
23770 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
23780 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
23790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
237a0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
237b0 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e  t_open(zShmFilen
237c0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
237d0 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30  (sStat.st_mode&0
237e0 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28  777));.      if(
237f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
23800 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
23810 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
23820 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
23830 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69  , "open", zShmFi
23840 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
23850 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
23860 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rr;.      }..   
23870 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72     /* If this pr
23880 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67  ocess is running
23890 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73   as root, make s
238a0 75 72 65 20 74 68 61 74 20 74 68 65 20 53 48 4d  ure that the SHM
238b0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69   file.      ** i
238c0 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73  s owned by the s
238d0 61 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f 77  ame user that ow
238e0 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ns the original 
238f0 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72  database.  Other
23900 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  wise,.      ** t
23910 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65  he original owne
23920 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  r will not be ab
23930 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20  le to connect.. 
23940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6f 73       */.      os
23950 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d  Fchown(pShmNode-
23960 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64  >h, sStat.st_uid
23970 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b  , sStat.st_gid);
23980 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  .  .      /* Che
23990 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ck to see if ano
239a0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
239b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64  holding the dead
239c0 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20  -man switch..   
239d0 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
239e0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
239f0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20  to zero length. 
23a00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23a10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23a20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 53 68        if( unixSh
23a30 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
23a40 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58  d, F_WRLCK, UNIX
23a50 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
23a60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23a70 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
23a80 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
23a90 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ->h, 0) ){.     
23aa0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
23ab0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
23ac0 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74  ERR_SHMOPEN, "ft
23ad0 72 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69  runcate", zShmFi
23ae0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
23af0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
23b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
23b20 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
23b30 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44  Lock(pDbFd, F_RD
23b40 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
23b50 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  S, 1);.      }. 
23b60 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
23b70 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
23b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
23b90 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f   Make the new co
23ba0 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64  nnection a child
23bb0 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   of the unixShmN
23bc0 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
23bd0 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
23be0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
23bf0 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
23c00 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
23c10 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
23c20 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
23c30 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
23c40 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d   p;.  unixLeaveM
23c50 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
23c60 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
23c70 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
23c80 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
23c90 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
23ca0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
23cb0 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  of the unixEnter
23cc0 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
23cd0 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
23ce0 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
23cf0 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29  (struct unixShm)
23d00 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
23d10 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
23d20 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
23d30 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
23d40 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
23d50 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
23d60 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
23d70 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
23d80 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
23d90 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
23da0 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
23db0 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
23dc0 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
23dd0 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
23de0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
23df0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
23e00 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
23e10 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
23e20 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
23e30 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
23e40 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
23e50 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
23e60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23e70 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
23e80 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
23e90 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
23ea0 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67  r:.  unixShmPurg
23eb0 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20  e(pDbFd);       
23ec0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
23ed0 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
23ee0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
23ef0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
23f00 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
23f10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23f20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
23f30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
23f40 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
23f50 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
23f60 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
23f70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
23f80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
23f90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23fa0 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
23fb0 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
23fc0 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
23fd0 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
23fe0 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
23ff0 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
24000 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
24010 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
24020 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
24030 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
24040 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
24050 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
24060 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
24070 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78  wise, if the bEx
24080 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  tend parameter i
24090 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
240a0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
240b0 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
240c0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
240d0 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
240e0 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
240f0 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
24100 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
24110 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
24120 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
24130 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
24140 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78  rned. If .** bEx
24150 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  tend is non-zero
24160 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
24170 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
24180 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
24190 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
241a0 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
241b0 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
241c0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
241d0 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
241e0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
241f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
24200 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
24210 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
24220 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
24230 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
24240 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
24250 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
24260 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
24270 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
24280 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
24290 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
242a0 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
242b0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
242c0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
242d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
242e0 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  ixShmMap(.  sqli
242f0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
24300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
24310 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
24320 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
24330 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
24360 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
24370 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
24380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24390 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
243a0 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c  /.  int bExtend,
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243c0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
243d0 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
243e0 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
243f0 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24410 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
24420 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ry */.){.  unixF
24430 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
24440 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e  ixFile*)fd;.  un
24450 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78  ixShm *p;.  unix
24460 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
24470 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
24480 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
24490 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78  ShmPerMap = unix
244a0 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
244b0 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67  );.  int nReqReg
244c0 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ion;..  /* If th
244d0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
244e0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
244f0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
24500 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
24510 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
24520 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
24530 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
24540 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
24550 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24560 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
24570 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
24580 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
24590 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
245a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
245b0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
245c0 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
245d0 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
245e0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
245f0 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
24600 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  gion==0 );.  ass
24610 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
24620 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
24630 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
24640 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
24650 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
24660 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
24670 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
24680 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
24690 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
246a0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
246b0 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  );..  /* Minimum
246c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f   number of regio
246d0 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 62  ns required to b
246e0 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e  e mapped. */.  n
246f0 52 65 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52  ReqRegion = ((iR
24700 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70  egion+nShmPerMap
24710 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20  ) / nShmPerMap) 
24720 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20  * nShmPerMap;.. 
24730 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
24740 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f  Region<nReqRegio
24750 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
24760 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
24770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24780 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72  ew apRegion[] ar
24790 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
247a0 42 79 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f  Byte = nReqRegio
247b0 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a  n*szRegion;   /*
247c0 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
247d0 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
247e0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
247f0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
24800 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
24810 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20   fstat() */..   
24820 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67   pShmNode->szReg
24830 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a  ion = szRegion;.
24840 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
24850 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
24860 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
24870 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
24880 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
24890 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
248a0 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20  ss space..      
248b0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
248c0 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
248d0 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
248e0 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
248f0 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  file is.      **
24900 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
24910 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
24920 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
24930 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
24940 66 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e  f( osFstat(pShmN
24950 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  ode->h, &sStat) 
24960 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
24970 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
24980 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f  SIZE;.        go
24990 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
249a0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
249b0 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69   if( sStat.st_si
249c0 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  ze<nByte ){.    
249d0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
249e0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
249f0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
24a00 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73  t. If bExtend is
24a10 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20   set to.        
24a20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65  ** false, exit e
24a30 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62  arly. *pp will b
24a40 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  e set to NULL an
24a50 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
24a60 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  rned..        */
24a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45  .        if( !bE
24a80 78 74 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  xtend ){.       
24a90 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
24aa0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
24ab0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72          /* Alter
24ac0 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78  natively, if bEx
24ad0 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78  tend is true, ex
24ae0 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44  tend the file. D
24af0 6f 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20  o this by.      
24b00 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73    ** writing a s
24b10 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
24b20 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f  e end of each (O
24b30 53 29 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20  S) page being.  
24b40 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
24b50 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20  ed or extended. 
24b60 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20  Technically, we 
24b70 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20  need only write 
24b80 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
24b90 2a 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f  * last page in o
24ba0 72 64 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74  rder to extend t
24bb0 68 65 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69  he file. But wri
24bc0 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a  ting to all new.
24bd0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73          ** pages
24be0 20 66 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74   forces the OS t
24bf0 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20  o allocate them 
24c00 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69  immediately, whi
24c10 63 68 20 72 65 64 75 63 65 73 0a 20 20 20 20 20  ch reduces.     
24c20 20 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65     ** the chance
24c30 73 20 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c  s of SIGBUS whil
24c40 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
24c50 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61  mapped region la
24c60 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20  ter on..        
24c70 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b  */.        else{
24c80 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
24c90 63 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a  c const int pgsz
24ca0 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20   = 4096;.       
24cb0 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20     int iPg;..   
24cc0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
24cd0 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  to the last byte
24ce0 20 6f 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61   of each newly a
24cf0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65  llocated or exte
24d00 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  nded page */.   
24d10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
24d20 6e 42 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30  nByte % pgsz)==0
24d30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   );.          fo
24d40 72 28 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f  r(iPg=(sStat.st_
24d50 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c  size/pgsz); iPg<
24d60 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50  (nByte/pgsz); iP
24d70 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
24d80 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69    if( seekAndWri
24d90 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  teFd(pShmNode->h
24da0 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73  , iPg*pgsz + pgs
24db0 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 30 29 21 3d  z-1, "", 1, 0)!=
24dc0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
24dd0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
24de0 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  File = pShmNode-
24df0 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20  >zFilename;.    
24e00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
24e10 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
24e20 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
24e30 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65  , "write", zFile
24e40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24e50 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24e60 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
24e70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24e90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
24ea0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
24eb0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
24ec0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
24ed0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
24ee0 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
24ef0 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
24f00 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
24f10 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
24f20 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a  ion, nReqRegion*
24f30 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20  sizeof(char *). 
24f40 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
24f50 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
24f60 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
24f70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
24f80 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24f90 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
24fa0 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
24fb0 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  New;.    while( 
24fc0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
24fd0 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a  n<nReqRegion ){.
24fe0 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d        int nMap =
24ff0 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65   szRegion*nShmPe
25000 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rMap;.      int 
25010 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  i;.      void *p
25020 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
25030 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
25040 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
25050 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a  osMmap(0, nMap,.
25060 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
25070 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
25080 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50   ? PROT_READ : P
25090 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52  ROT_READ|PROT_WR
250a0 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ITE, .          
250b0 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53    MAP_SHARED, pS
250c0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67  hmNode->h, szReg
250d0 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64  ion*(i64)pShmNod
250e0 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20  e->nRegion.     
250f0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
25100 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c  ( pMem==MAP_FAIL
25110 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
25120 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
25130 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
25140 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70  HMMAP, "mmap", p
25150 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
25160 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
25170 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
25180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
251a0 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMem = sqlite3_m
251b0 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b  alloc(szRegion);
251c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
251d0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
251e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
251f0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67  MEM;.          g
25200 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
25210 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25220 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
25230 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
25240 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
25250 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d  (i=0; i<nShmPerM
25260 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ap; i++){.      
25270 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
25280 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
25290 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63  Region+i] = &((c
252a0 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67  har*)pMem)[szReg
252b0 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  ion*i];.      }.
252c0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
252d0 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50  nRegion += nShmP
252e0 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  erMap;.    }.  }
252f0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
25300 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
25310 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
25320 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
25330 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
25340 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
25350 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
25360 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
25370 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
25380 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
253a0 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
253b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
253c0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
253d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
253e0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
253f0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
25400 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
25410 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
25420 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
25430 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
25440 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
25450 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
25460 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
25470 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
25480 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
25490 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
254a0 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
254b0 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
254c0 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
254d0 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
254e0 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
254f0 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
25500 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
25510 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
25520 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
25530 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
25540 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
25550 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
25560 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
25570 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
25580 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
25590 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
255a0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
255b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255c0 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
255d0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
255e0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25610 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
25620 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
25630 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25650 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
25660 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
25670 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
25680 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
25690 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
256a0 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
256b0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
256c0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
256d0 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
256e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
256f0 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
25700 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
25710 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25730 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
25740 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
25750 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
25760 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
25770 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
25780 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
25790 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
257a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
257b0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
257c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
257d0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
257e0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25800 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
25810 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
25820 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
25830 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
25840 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
25850 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
25860 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
25870 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
25880 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
25890 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
258a0 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
258b0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
258c0 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
258d0 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
258e0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
258f0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
25900 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
25910 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
25920 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
25930 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
25940 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
25950 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
25960 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
25970 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
25980 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
25990 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
259a0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
259b0 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
259c0 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
259d0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
259e0 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
259f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
25a00 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
25a10 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
25a20 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
25a30 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
25a40 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
25a50 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
25a60 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
25a70 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
25a80 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
25a90 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
25aa0 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
25ab0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
25ac0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
25ad0 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
25ae0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
25af0 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
25b00 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
25b10 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
25b20 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
25b30 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
25b40 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
25b50 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
25b60 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
25b70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
25b80 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
25b90 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
25ba0 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
25bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
25bc0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
25bd0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
25be0 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
25bf0 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
25c00 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
25c10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
25c20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
25c30 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
25c40 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
25c50 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
25c60 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
25c70 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
25c80 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  Fd, F_UNLCK, ofs
25c90 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
25ca0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
25cb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25cc0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
25cd0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
25ce0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
25cf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25d00 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
25d10 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
25d20 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
25d30 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
25d40 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
25d50 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
25d60 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
25d70 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
25d80 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
25d90 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
25da0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
25db0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
25dc0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
25dd0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
25de0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
25df0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
25e00 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
25e10 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
25e20 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
25e30 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
25e40 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
25e50 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
25e60 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
25e70 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
25e80 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
25e90 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
25ea0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
25eb0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
25ec0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
25ed0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
25ee0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
25ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
25f00 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
25f10 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
25f20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
25f30 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
25f40 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
25f50 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
25f60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25f70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
25f80 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
25f90 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
25fa0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
25fb0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
25fc0 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
25fd0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
25fe0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
25ff0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26000 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
26010 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
26020 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
26030 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
26040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26050 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
26060 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
26070 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
26080 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
26090 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
260a0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
260b0 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
260c0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
260d0 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
260e0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
260f0 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
26100 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
26110 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
26120 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
26130 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
26140 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
26150 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
26160 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
26170 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
26180 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26190 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
261a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
261b0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
261c0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
261d0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
261e0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
261f0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
26200 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
26210 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
26220 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
26230 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
26240 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26250 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
26260 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
26270 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
26280 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
26290 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
262a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
262b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
262c0 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
262d0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
262e0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
262f0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
26300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
26310 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
26320 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
26330 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
26340 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
26350 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
26360 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
26370 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
26380 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20  d, osGetpid(0), 
26390 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
263a0 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
263b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
263c0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
263d0 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
263e0 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
263f0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
26400 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
26410 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
26420 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
26430 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
26440 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
26450 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
26460 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
26470 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
26480 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
26490 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
264a0 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
264b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
264c0 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
264d0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
264e0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
264f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
26500 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
26510 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65  utex();.  unixLe
26520 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
26530 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
26540 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
26550 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
26560 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
26570 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
26580 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
26590 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
265a0 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20  re is no shared 
265b0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
265c0 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65  d with the conne
265d0 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a  ction then this.
265e0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ** routine is a 
265f0 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a  harmless no-op..
26600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
26610 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  ixShmUnmap(.  sq
26620 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26640 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
26650 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
26660 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
26670 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
26680 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61     /* Delete sha
26690 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72  red-memory if tr
266a0 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ue */.){.  unixS
266b0 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
266c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
266d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
266e0 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75  be closed */.  u
266f0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
26700 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
26710 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
26720 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
26730 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ile */.  unixShm
26740 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
26750 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
26760 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
26770 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
26780 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
26790 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20  pDbFd;          
267a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
267b0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
267c0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46   file */..  pDbF
267d0 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
267e0 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
267f0 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
26800 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
26810 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
26820 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
26830 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
26840 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
26850 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
26860 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
26870 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
26880 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f  ->pInode );..  /
26890 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  * Remove connect
268a0 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73  ion p from the s
268b0 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  et of connection
268c0 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  s associated.  *
268d0 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20  * with pShmNode 
268e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
268f0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
26900 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72  e->mutex);.  for
26910 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70  (pp=&pShmNode->p
26920 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b  First; (*pp)!=p;
26930 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e   pp = &(*pp)->pN
26940 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70  ext){}.  *pp = p
26950 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46  ->pNext;..  /* F
26960 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ree the connecti
26970 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  on p */.  sqlite
26980 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62  3_free(p);.  pDb
26990 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20  Fd->pShm = 0;.  
269a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
269b0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
269c0 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  tex);..  /* If p
269d0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61  ShmNode->nRef ha
269e0 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65  s reached 0, the
269f0 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65  n close the unde
26a00 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72  rlying.  ** shar
26a10 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
26a20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  too */.  unixEnt
26a30 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
26a40 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
26a50 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
26a60 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
26a70 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
26a80 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f==0 ){.    if( 
26a90 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53  deleteFlag && pS
26aa0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
26ab0 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70        osUnlink(p
26ac0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
26ad0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  me);.    }.    u
26ae0 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46  nixShmPurge(pDbF
26af0 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
26b00 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
26b10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26b20 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}...#else.# def
26b30 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  ine unixShmMap  
26b40 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
26b50 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  ixShmLock    0.#
26b60 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42   define unixShmB
26b70 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
26b80 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20  e unixShmUnmap  
26b90 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
26ba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26bb0 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  _WAL */..#if SQL
26bc0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
26bd0 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20  E>0./*.** If it 
26be0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d  is currently mem
26bf0 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61  ory mapped, unma
26c00 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73  p file pFd..*/.s
26c10 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55  tatic void unixU
26c20 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  nmapfile(unixFil
26c30 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72  e *pFd){.  asser
26c40 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
26c50 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t==0 );.  if( pF
26c60 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b  d->pMapRegion ){
26c70 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46  .    osMunmap(pF
26c80 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70  d->pMapRegion, p
26c90 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
26ca0 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d  al);.    pFd->pM
26cb0 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
26cc0 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20    pFd->mmapSize 
26cd0 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
26ce0 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
26cf0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
26d00 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
26d10 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65  e size of the me
26d20 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69  mory mapping mai
26d30 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20  ntained by file 
26d40 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
26d50 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73  Fd to nNew bytes
26d60 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  . Any existing m
26d70 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72  apping is discar
26d80 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ded..**.** If su
26d90 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66  ccessful, this f
26da0 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
26db0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
26dc0 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  bles:.**.**     
26dd0 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52    unixFile.pMapR
26de0 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75  egion.**       u
26df0 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
26e00 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
26e10 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  le.mmapSizeActua
26e20 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63  l.**.** If unsuc
26e30 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f  cessful, an erro
26e40 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67  r message is log
26e50 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f  ged via sqlite3_
26e60 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65  log() and.** the
26e70 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73   three variables
26e80 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65   above are zeroe
26e90 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
26ea0 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a  SQLite should.**
26eb0 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73   continue access
26ec0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
26ed0 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64   using the xRead
26ee0 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a  () and xWrite().
26ef0 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ** methods..*/.s
26f00 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52  tatic void unixR
26f10 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78  emapfile(.  unix
26f20 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20  File *pFd,      
26f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26f40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
26f50 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e  bject */.  i64 n
26f60 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20  New             
26f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26f80 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73  quired mapping s
26f90 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ize */.){.  cons
26fa0 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22  t char *zErr = "
26fb0 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d  mmap";.  int h =
26fc0 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20   pFd->h;        
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26fe0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
26ff0 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65   open on db file
27000 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20   */.  u8 *pOrig 
27010 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  = (u8 *)pFd->pMa
27020 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f  pRegion;   /* Po
27030 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
27040 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f   file mapping */
27050 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70  .  i64 nOrig = p
27060 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
27070 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  al;     /* Size 
27080 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20  of pOrig region 
27090 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38  in bytes */.  u8
270a0 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270c0 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f     /* Location o
270d0 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f  f new mapping */
270e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50  .  int flags = P
270f0 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20  ROT_READ;       
27100 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
27110 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70   to pass to mmap
27120 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  () */..  assert(
27130 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
27140 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
27150 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nNew>pFd->mmapSi
27160 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
27170 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53  nNew<=pFd->mmapS
27180 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65  izeMax );.  asse
27190 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
271a0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61  assert( pFd->mma
271b0 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64  pSizeActual>=pFd
271c0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
271d0 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c  assert( MAP_FAIL
271e0 45 44 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ED!=0 );..  if( 
271f0 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
27200 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
27210 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
27220 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 0a 20 20   PROT_WRITE;..  
27230 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23 69 66  if( pOrig ){.#if
27240 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20   HAVE_MREMAP.   
27250 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 70 46   i64 nReuse = pF
27260 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65 6c  d->mmapSize;.#el
27270 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
27280 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f 73 47   szSyspage = osG
27290 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 20 20  etpagesize();.  
272a0 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 28    i64 nReuse = (
272b0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20  pFd->mmapSize & 
272c0 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29 3b  ~(szSyspage-1));
272d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a  .#endif.    u8 *
272e0 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52  pReq = &pOrig[nR
272f0 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55  euse];..    /* U
27300 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f  nmap any pages o
27310 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  f the existing m
27320 61 70 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e  apping that cann
27330 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f  ot be reused. */
27340 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73 65 21  .    if( nReuse!
27350 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  =nOrig ){.      
27360 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e  osMunmap(pReq, n
27370 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20  Orig-nReuse);.  
27380 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52    }..#if HAVE_MR
27390 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20  EMAP.    pNew = 
273a0 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20  osMremap(pOrig, 
273b0 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52  nReuse, nNew, MR
273c0 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20  EMAP_MAYMOVE);. 
273d0 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61     zErr = "mrema
273e0 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e  p";.#else.    pN
273f0 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71  ew = osMmap(pReq
27400 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66  , nNew-nReuse, f
27410 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44  lags, MAP_SHARED
27420 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20  , h, nReuse);.  
27430 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f    if( pNew!=MAP_
27440 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
27450 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29  if( pNew!=pReq )
27460 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d  {.        osMunm
27470 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20  ap(pNew, nNew - 
27480 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20  nReuse);.       
27490 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20   pNew = 0;.     
274a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
274b0 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20  pNew = pOrig;.  
274c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
274d0 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  if..    /* The a
274e0 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64  ttempt to extend
274f0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
27500 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72  pping failed. Fr
27510 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ee it. */.    if
27520 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
27530 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b  ED || pNew==0 ){
27540 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
27550 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a  pOrig, nReuse);.
27560 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
27570 49 66 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c  If pNew is still
27580 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72   NULL, try to cr
27590 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79  eate an entirely
275a0 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f   new mapping. */
275b0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
275c0 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  {.    pNew = osM
275d0 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61  map(0, nNew, fla
275e0 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20  gs, MAP_SHARED, 
275f0 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  h, 0);.  }..  if
27600 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
27610 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  ED ){.    pNew =
27620 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30   0;.    nNew = 0
27630 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  ;.    unixLogErr
27640 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45  or(SQLITE_OK, zE
27650 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  rr, pFd->zPath);
27660 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
27670 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66 61 69  mmap() above fai
27680 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74  led, assume that
27690 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
276a0 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20  mmap() calls.   
276b0 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c   ** will probabl
276c0 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c  y fail too. Fall
276d0 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78   back to using x
276e0 52 65 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c  Read/xWrite excl
276f0 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69  usively.    ** i
27700 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
27710 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
27720 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  zeMax = 0;.  }. 
27730 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
27740 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b   = (void *)pNew;
27750 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  .  pFd->mmapSize
27760 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
27770 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d  Actual = nNew;.}
27780 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d  ../*.** Memory m
27790 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20  ap or remap the 
277a0 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66  file opened by f
277b0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
277c0 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a  Fd (if the file.
277d0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61  ** is already ma
277e0 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69  pped, the existi
277f0 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65  ng mapping is re
27800 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65  placed by the ne
27810 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74  w). Or, if .** t
27820 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
27830 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
27840 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
27850 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
27860 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67   .** outstanding
27870 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65   xFetch() refere
27880 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73  nces to it, this
27890 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
278a0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  o-op..**.** If p
278b0 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69  arameter nByte i
278c0 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20  s non-negative, 
278d0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
278e0 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66  equested size of
278f0 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67   .** the mapping
27900 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
27910 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
27920 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
27930 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  o, then the .** 
27940 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
27950 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
27960 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
27970 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
27980 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
27990 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
279a0 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
279b0 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
279c0 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a  lue configured .
279d0 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f  ** using SQLITE_
279e0 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54  FCNTL_MMAP_LIMIT
279f0 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
27a00 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
27a10 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
27a20 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
27a30 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
27a40 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
27a50 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
27a60 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
27a70 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
27a80 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
27a90 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
27aa0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
27ab0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
27ac0 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
27ad0 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
27ae0 7b 0a 20 20 69 36 34 20 6e 4d 61 70 20 3d 20 6e  {.  i64 nMap = n
27af0 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Byte;.  int rc;.
27b00 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
27b10 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63  =0 || pFd->nFetc
27b20 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  hOut==0 );.  if(
27b30 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
27b40 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
27b50 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  E_OK;..  if( nMa
27b60 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  p<0 ){.    struc
27b70 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
27b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d           /* Low-
27b90 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72  level file infor
27ba0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 63  mation */.    rc
27bb0 20 3d 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e   = osFstat(pFd->
27bc0 68 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  h, &statbuf);.  
27bd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
27bf0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27c00 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
27c10 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66    nMap = statbuf
27c20 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20  .st_size;.  }.  
27c30 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
27c40 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
27c50 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
27c60 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20  pSizeMax;.  }.. 
27c70 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
27c80 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
27c90 69 66 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20  if( nMap>0 ){.  
27ca0 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c      unixRemapfil
27cb0 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20  e(pFd, nMap);.  
27cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
27cd0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
27ce0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
27cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27d00 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
27d10 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
27d20 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
27d30 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
27d40 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
27d50 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
27d60 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
27d70 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
27d80 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
27d90 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
27da0 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
27db0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
27dc0 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
27dd0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
27de0 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
27df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27e00 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
27e10 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
27e20 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
27e30 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
27e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
27e50 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
27e60 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
27e70 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
27e80 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
27e90 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
27ea0 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
27eb0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
27ec0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
27ed0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
27ee0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
27ef0 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
27f00 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  ust eventually .
27f10 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
27f20 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
27f30 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28  ing unixUnfetch(
27f40 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
27f50 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74   unixFetch(sqlit
27f60 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
27f70 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
27f80 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
27f90 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27fa0 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
27fb0 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
27fc0 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
27fd0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
27fe0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
27ff0 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
28000 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
28010 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
28020 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
28030 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
28040 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
28050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
28060 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
28070 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
28080 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28090 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
280a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
280b0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
280c0 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
280d0 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
280e0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
280f0 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
28100 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
28110 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
28120 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
28130 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
28140 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
28150 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
28160 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
28170 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20  tion releases a 
28180 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62  .** reference ob
28190 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72  tained by an ear
281a0 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69  lier call to uni
281b0 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  xFetch(). The se
281c0 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
281d0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
281e0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
281f0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
28200 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
28210 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
28220 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
28230 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e  e unixFetch() in
28240 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
28250 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
28260 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
28270 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
28280 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
28290 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
282a0 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
282b0 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
282c0 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
282d0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
282e0 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
282f0 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
28300 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
28310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
28320 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74  nixUnfetch(sqlit
28330 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
28340 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
28350 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
28360 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
28370 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
28380 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
28390 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
283a0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
283b0 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
283c0 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
283d0 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
283e0 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
283f0 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
28400 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
28410 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
28420 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
28430 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
28440 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
28450 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
28460 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
28470 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
28480 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
28490 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
284a0 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
284b0 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
284c0 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
284d0 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
284e0 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
284f0 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
28500 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
28510 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
28520 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
28530 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
28540 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
28550 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
28560 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
28570 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
28580 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73  chOut>=0 );.#els
28590 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
285a0 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
285b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
285c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
285d0 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69  TER(iOff);.#endi
285e0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
285f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
28600 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
28610 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
28620 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
28630 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
28640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28650 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
28660 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
28670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
28690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
286e0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
286f0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
28700 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
28710 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
28720 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
28730 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
28740 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
28750 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
28760 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
28770 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
28780 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
28790 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
287a0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
287b0 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
287c0 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
287d0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
287e0 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
287f0 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
28800 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
28810 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
28820 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
28830 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
28840 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
28850 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
28860 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
28870 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
28880 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
28890 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
288a0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
288b0 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
288c0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
288d0 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
288e0 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
288f0 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
28900 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
28910 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
28920 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
28930 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
28940 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
28950 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
28960 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
28970 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
28980 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  r finder-functio
28990 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
289a0 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
289b0 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
289c0 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
289d0 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
289e0 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
289f0 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
28a00 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
28a10 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
28a20 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
28a30 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
28a40 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
28a50 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
28a60 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
28a70 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
28a80 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
28a90 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
28aa0 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
28ab0 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
28ac0 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
28ad0 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
28ae0 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
28af0 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
28b00 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
28b10 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
28b20 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
28b30 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
28b40 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
28b50 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
28b60 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
28b70 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28b80 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
28b90 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
28ba0 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
28bb0 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
28bc0 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
28bd0 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
28be0 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
28bf0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
28c00 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
28c10 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
28c20 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
28c30 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
28c40 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
28c50 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
28c60 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
28c70 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52  INDER,METHOD,VER
28c80 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c  SION,CLOSE,LOCK,
28c90 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48  UNLOCK,CKLOCK,SH
28ca0 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74  MMAP)     \.stat
28cb0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
28cc0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
28cd0 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
28d00 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
28d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
28d20 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
28d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
28d50 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
28d60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
28d70 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28da0 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
28db0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
28dc0 20 2a 2f 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 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
28df0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
28e00 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
28e10 20 2a 2f 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 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
28e40 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
28e50 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
28e60 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e80 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
28e90 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
28ea0 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
28ee0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
28ef0 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
28f00 20 2a 2f 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 20                  
28f20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f90 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
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 20 20 20                  
28fc0 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
28ff0 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29010 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
29020 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
29030 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
29040 2a 2f 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 20 20 20 5c 0a                \.
29060 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
29070 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
29080 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
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 20 20 20 5c 0a 20               \. 
290b0 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
290c0 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
290d0 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
290e0 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
290f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29100 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20   SHMMAP,        
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29120 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
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 20 20 20 5c 0a 20 20 20             \.   
29150 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
29160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29170 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
291a0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
291b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
291c0 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
291f0 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  ixShmUnmap,     
29200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
29210 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29230 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
29240 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  xFetch,         
29250 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
29260 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29280 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29290 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20  Unfetch,        
292a0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
292b0 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
292c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292d0 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29320 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
29330 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
29340 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
29350 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
29360 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
29370 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
29380 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
29390 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
293a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293c0 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
293d0 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
293e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29410 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29460 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
29470 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29480 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
29490 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
294a0 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
294b0 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
294c0 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
294d0 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
294e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
294f0 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
29500 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
29510 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
29520 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
29530 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
29540 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
29550 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
29560 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
29570 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
29580 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
29590 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
295a0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
295b0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
295c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
295d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
295e0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
295f0 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
29600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29610 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ared memory and 
29620 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64  mmap are enabled
29630 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
29640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29650 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29660 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
29670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29680 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
29690 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
296a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
296b0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
296c0 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
296d0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
296e0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
296f0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
29700 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20    unixShmMap    
29710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29720 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
29730 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
29740 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  nolockIoFinder, 
29750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
29760 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
29770 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d  e */.  nolockIoM
29780 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
29790 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
297a0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
297b0 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20  me */.  3,      
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297d0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
297e0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
297f0 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  /.  nolockClose,
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29810 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
29820 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  /.  nolockLock, 
29830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29840 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
29850 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  .  nolockUnlock,
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29870 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
29880 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  /.  nolockCheckR
29890 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a  eservedLock,  /*
298a0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
298b0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
298c0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
298d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
298e0 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
298f0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f  .IOMETHODS(.  do
29900 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  tlockIoFinder,  
29910 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29920 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
29930 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65  */.  dotlockIoMe
29940 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f  thods,         /
29950 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29960 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
29970 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
299a0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
299b0 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20    dotlockClose, 
299c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
299d0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
299e0 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20    dotlockLock,  
299f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29a00 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29a10 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20   dotlockUnlock, 
29a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
29a30 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
29a40 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65    dotlockCheckRe
29a50 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78  servedLock, /* x
29a60 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29a70 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a90 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29aa0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ap method */.)..
29ab0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
29ac0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29ad0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f  IOMETHODS(.  flo
29ae0 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
29af0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
29b00 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
29b10 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  /.  flockIoMetho
29b20 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
29b30 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29b40 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
29b50 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b70 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
29b80 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
29b90 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
29ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
29bb0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
29bc0 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
29bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
29be0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29bf0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
29c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
29c10 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
29c20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
29c30 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43  vedLock,   /* xC
29c40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29c50 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c70 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
29c80 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
29c90 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
29ca0 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
29cb0 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29cd0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
29ce0 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
29cf0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
29d00 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
29d10 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29d20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d40 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
29d50 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
29d60 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c   */.  semXClose,
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29d90 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20   */.  semXLock, 
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29db0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
29dc0 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c  */.  semXUnlock,
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29de0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
29df0 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52   */.  semXCheckR
29e00 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
29e10 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
29e20 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
29e30 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
29e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29e50 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
29e60 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
29e70 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
29e80 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
29e90 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
29ea0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66  .IOMETHODS(.  af
29eb0 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  pIoFinder,      
29ec0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29ed0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
29ee0 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64  */.  afpIoMethod
29ef0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
29f00 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29f10 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
29f20 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f40 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29f50 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
29f60 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20    afpClose,     
29f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29f80 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
29f90 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20    afpLock,      
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29fb0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29fc0 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   afpUnlock,     
29fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
29fe0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
29ff0 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76    afpCheckReserv
2a000 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78  edLock,     /* x
2a010 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2a020 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2a050 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2a060 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
2a070 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
2a080 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
2a090 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
2a0a0 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
2a0b0 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
2a0c0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
2a0d0 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
2a0e0 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
2a0f0 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
2a100 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
2a110 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
2a120 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
2a130 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
2a140 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
2a150 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
2a160 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
2a170 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
2a180 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
2a190 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
2a1a0 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
2a1b0 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
2a1c0 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
2a1d0 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
2a1e0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2a1f0 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
2a200 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
2a210 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
2a220 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
2a230 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
2a240 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
2a250 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2a260 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2a270 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a280 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
2a290 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
2a2a0 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
2a2b0 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
2a2c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2a2d0 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
2a2e0 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
2a2f0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
2a300 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
2a310 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
2a320 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2a330 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
2a340 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
2a350 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2a360 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2a370 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
2a380 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
2a390 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2a3a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2a3b0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2a3c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2a3e0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2a3f0 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
2a400 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2a410 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2a420 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2a430 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2a440 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2a450 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
2a460 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2a470 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2a480 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2a490 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2a4a0 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k,   /* xCheckRe
2a4b0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2a4c0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4e0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2a4f0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2a500 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
2a510 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
2a520 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
2a530 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
2a540 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
2a550 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2a560 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2a570 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a580 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
2a590 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a5b0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2a5c0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
2a5d0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2a5e0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2a5f0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2a600 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a620 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2a630 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2a640 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
2a650 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2a660 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2a670 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
2a680 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a690 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2a6a0 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
2a6b0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a6c0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2a6d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2a6e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2a6f0 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
2a700 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2a710 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a730 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
2a740 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
2a750 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
2a760 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2a770 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2a780 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
2a790 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
2a7a0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
2a7b0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2a7c0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
2a7d0 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
2a7e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a7f0 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
2a800 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
2a810 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
2a820 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
2a830 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
2a840 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
2a850 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
2a860 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
2a870 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2a880 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a890 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
2a8a0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
2a8b0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
2a8c0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
2a8d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2a8e0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
2a8f0 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
2a900 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2a910 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2a920 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
2a930 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2a940 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
2a950 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2a960 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
2a970 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
2a980 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
2a990 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
2a9a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2a9b0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
2a9c0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
2a9d0 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
2a9e0 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
2a9f0 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
2aa00 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
2aa10 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
2aa20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
2aa30 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
2aa40 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
2aa50 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
2aa60 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2aa70 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
2aa80 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
2aa90 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
2aaa0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
2aab0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
2aac0 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
2aad0 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
2aae0 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
2aaf0 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
2ab00 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
2ab10 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
2ab20 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2ab30 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
2ab40 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
2ab50 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2ab60 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
2ab70 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2ab80 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
2ab90 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
2aba0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
2abb0 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
2abc0 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
2abd0 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
2abe0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2abf0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
2ac00 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
2ac10 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
2ac20 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
2ac30 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2ac40 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2ac50 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2ac60 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
2ac70 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
2ac80 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
2ac90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2aca0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
2acb0 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
2acc0 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
2acd0 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
2ace0 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
2acf0 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
2ad00 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
2ad10 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
2ad20 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
2ad30 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
2ad40 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
2ad50 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
2ad60 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
2ad70 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
2ad80 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
2ad90 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
2ada0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
2adb0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
2adc0 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
2add0 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
2ade0 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
2adf0 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
2ae00 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2ae10 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
2ae20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ae30 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
2ae40 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2ae50 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
2ae60 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2ae70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2ae80 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
2ae90 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2aea0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2aeb0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2aec0 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
2aed0 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
2aee0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2aef0 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
2af00 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2af10 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
2af20 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2af30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2af40 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
2af50 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a  OS_VXWORKS./*.**
2af60 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
2af70 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f  unction for VxWo
2af80 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65  rks checks to se
2af90 65 20 69 66 20 70 6f 73 69 78 20 61 64 76 69 73  e if posix advis
2afa0 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77  ory.** locking w
2afb0 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65  orks.  If it doe
2afc0 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 20  s, then that is 
2afd0 77 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 49  what is used.  I
2afe0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  f it does not.**
2aff0 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c   work, then fall
2b000 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65  back to named se
2b010 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e  maphore locking.
2b020 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2b030 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2b040 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69  ods *vxworksIoFi
2b050 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
2b060 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
2b070 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
2b080 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b090 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
2b0a0 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
2b0b0 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  /* the open file
2b0c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
2b0d0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
2b0e0 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
2b0f0 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
2b100 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
2b110 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
2b120 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
2b130 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
2b140 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
2b150 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
2b160 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
2b170 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2b180 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
2b190 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63  .  /* Test if fc
2b1a0 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74  ntl() is support
2b1b0 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58  ed and use POSIX
2b1c0 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20   style locks..  
2b1d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  ** Otherwise fal
2b1e0 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61  l back to the na
2b1f0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65  med semaphore me
2b200 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63  thod..  */.  loc
2b210 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
2b220 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
2b230 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
2b240 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
2b250 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
2b260 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
2b270 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
2b280 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
2b290 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
2b2a0 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74  !=-1 ) {.    ret
2b2b0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
2b2c0 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
2b2d0 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d    return &semIoM
2b2e0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2b2f0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2b300 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2b310 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b   *(*const vxwork
2b320 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  sIoFinder)(const
2b330 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2b340 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e  ) = vxworksIoFin
2b350 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2b360 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
2b370 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
2b380 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
2b390 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f  pointer to an IO
2b3a0 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
2b3b0 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65  unction:.*/.type
2b3c0 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  def const sqlite
2b3d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
2b3e0 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e  finder_type)(con
2b3f0 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2b400 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  e*);.../********
2b410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b450 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2b460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b470 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
2b480 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
2b490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4a0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
2b4b0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
2b4c0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2b4d0 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
2b4e0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
2b4f0 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
2b500 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2b510 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2b520 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
2b530 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
2b540 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74  to by pId..*/.st
2b550 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
2b560 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74  nixFile(.  sqlit
2b570 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2b580 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2b590 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
2b5a0 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
2b5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
2b5c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2b5d0 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   of file being o
2b5e0 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
2b5f0 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
2b600 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
2b610 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2b620 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2b630 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2b640 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
2b650 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
2b660 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
2b670 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20  t ctrlFlags     
2b680 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72        /* Zero or
2b690 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a   more UNIXFILE_*
2b6a0 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
2b6b0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2b6c0 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
2b6d0 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
2b6e0 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
2b6f0 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
2b700 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b710 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
2b720 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
2b730 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c   );..  /* Usuall
2b740 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65  y the path zFile
2b750 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  name should not 
2b760 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  be a relative pa
2b770 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a  thname. The.  **
2b780 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68   exception is wh
2b790 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70  en opening the p
2b7a0 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c  roxy "conch" fil
2b7b0 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74  e in builds that
2b7c0 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68  .  ** include th
2b7d0 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20  e special Apple 
2b7e0 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a  locking styles..
2b7f0 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
2b800 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2b810 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2b820 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73  KING_STYLE.  ass
2b830 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ert( zFilename==
2b840 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
2b850 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70  ]=='/' .    || p
2b860 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28  Vfs->pAppData==(
2b870 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
2b880 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65  oFinder );.#else
2b890 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
2b8a0 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
2b8b0 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  name[0]=='/' );.
2b8c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20  #endif..  /* No 
2b8d0 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69  locking occurs i
2b8e0 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n temporary file
2b8f0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  s */.  assert( z
2b900 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28  Filename!=0 || (
2b910 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
2b920 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20  FILE_NOLOCK)!=0 
2b930 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
2b940 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
2b950 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
2b960 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20  ));.  pNew->h = 
2b970 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20  h;.  pNew->pVfs 
2b980 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e  = pVfs;.  pNew->
2b990 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  zPath = zFilenam
2b9a0 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  e;.  pNew->ctrlF
2b9b0 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46  lags = (u8)ctrlF
2b9c0 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  lags;.#if SQLITE
2b9d0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
2b9e0 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a  .  pNew->mmapSiz
2b9f0 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c  eMax = sqlite3Gl
2ba00 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
2ba10 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  p;.#endif.  if( 
2ba20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2ba30 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20  ean(((ctrlFlags 
2ba40 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20  & UNIXFILE_URI) 
2ba50 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29  ? zFilename : 0)
2ba60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73               "ps
2ba80 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
2ba90 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
2baa0 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
2bab0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2bac0 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20  ILE_PSOW;.  }.  
2bad0 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d  if( strcmp(pVfs-
2bae0 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63  >zName,"unix-exc
2baf0 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  l")==0 ){.    pN
2bb00 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
2bb10 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a   UNIXFILE_EXCL;.
2bb20 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
2bb30 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
2bb40 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
2bb50 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
2bb60 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
2bb70 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c  =0 ){.    ctrlFl
2bb80 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2bb90 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  NOLOCK;.    rc =
2bba0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2bbb0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2bbc0 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49   ctrlFlags & UNI
2bbd0 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a  XFILE_NOLOCK ){.
2bbe0 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
2bbf0 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
2bc00 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2bc10 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2bc20 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
2bc30 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
2bc40 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
2bc50 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
2bc60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2bc70 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
2bc80 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
2bc90 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
2bca0 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
2bcb0 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
2bcc0 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
2bcd0 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
2bce0 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
2bcf0 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
2bd00 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
2bd10 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
2bd20 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2bd30 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
2bd40 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
2bd50 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2bd60 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
2bd70 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
2bd80 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
2bd90 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2bda0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2bdb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2bdc0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2bdd0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2bde0 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
2bdf0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2be00 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
2be10 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69  dif.  ){.    uni
2be20 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2be30 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
2be40 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
2be50 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
2be60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2be70 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  K ){.      /* If
2be80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2be90 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49  ed in findInodeI
2bea0 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65  nfo(), close the
2beb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2bec0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  .      ** immedi
2bed0 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65  ately, before re
2bee0 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  leasing the mute
2bef0 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  x. findInodeInfo
2bf00 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20  () may fail.    
2bf10 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e    ** in two scen
2bf20 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  arios:.      **.
2bf30 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41        **   (a) A
2bf40 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29   call to fstat()
2bf50 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2bf60 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63  *   (b) A malloc
2bf70 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2bf80 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61  *.      ** Scena
2bf90 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79  rio (b) may only
2bfa0 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72   occur if the pr
2bfb0 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
2bfc0 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20   no other.      
2bfd0 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
2bfe0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
2bff0 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68  same file. If th
2c000 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66  ere were other f
2c010 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
2c020 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73  criptors on this
2c030 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d   file, then no m
2c040 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72  alloc would be r
2c050 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2c060 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   ** findInodeInf
2c070 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20  o(). If this is 
2c080 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20  the case, it is 
2c090 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c  quite safe to cl
2c0a0 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ose.      ** han
2c0b0 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73  dle h - as it is
2c0c0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
2c0d0 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20   no posix locks 
2c0e0 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64  will be released
2c0f0 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69  .      ** by doi
2c100 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a  ng so..      **.
2c110 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e        ** If scen
2c120 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20  ario (a) caused 
2c130 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74  the error then t
2c140 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f  hings are not so
2c150 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20   safe. The.     
2c160 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73   ** implicit ass
2c170 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20  umption here is 
2c180 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20  that if fstat() 
2c190 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72  fails, things ar
2c1a0 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75  e in.      ** su
2c1b0 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61  ch bad shape tha
2c1c0 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63  t dropping a loc
2c1d0 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74  k or two doesn't
2c1e0 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20   matter much..  
2c1f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62      */.      rob
2c200 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2c210 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2c220 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2c230 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2c240 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66  utex();.  }..#if
2c250 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2c260 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2c270 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2c280 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  _).  else if( pL
2c290 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2c2a0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
2c2b0 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69      /* AFP locki
2c2c0 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2c2d0 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2c2e0 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
2c2f0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61   in.    ** the a
2c300 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2c310 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70  ..    */.    afp
2c320 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2c330 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pCtx;.    pNew->
2c340 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2c350 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
2c360 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
2c370 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28  pCtx) );.    if(
2c380 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pCtx==0 ){.    
2c390 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2c3a0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
2c3b0 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
2c3c0 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
2c3d0 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
2c3e0 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
2c3f0 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
2c400 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
2c410 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
2c420 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
2c430 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
2c440 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
2c450 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
2c460 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
2c470 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2c480 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
2c490 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
2c4a0 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
2c4b0 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
2c4c0 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
2c4d0 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2c4e0 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2c4f0 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  node);.      if(
2c500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c510 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2c520 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
2c530 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
2c540 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2c550 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2c560 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68  NE__);.        h
2c570 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
2c580 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
2c590 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20  tex();        . 
2c5a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2c5b0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2c5c0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f  kingStyle == &do
2c5d0 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
2c5e0 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65  {.    /* Dotfile
2c5f0 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2c600 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2c610 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2c620 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2c630 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   the dotlockLock
2c640 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20  ingContext .    
2c650 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  */.    char *zLo
2c660 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  ckFile;.    int 
2c670 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61  nFilename;.    a
2c680 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2c690 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65  !=0 );.    nFile
2c6a0 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  name = (int)strl
2c6b0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  en(zFilename) + 
2c6c0 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65  6;.    zLockFile
2c6d0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
2c6e0 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e  e3_malloc(nFilen
2c6f0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c  ame);.    if( zL
2c700 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ockFile==0 ){.  
2c710 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c720 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2c730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2c740 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61  snprintf(nFilena
2c750 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22  me, zLockFile, "
2c760 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  %s" DOTLOCK_SUFF
2c770 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  IX, zFilename);.
2c780 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
2c790 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2c7a0 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a   zLockFile;.  }.
2c7b0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2c7c0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2c7d0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d  ingStyle == &sem
2c7e0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2c7f0 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68   /* Named semaph
2c800 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ore locking uses
2c810 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2c820 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2c830 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64  .    ** included
2c840 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69   in the semLocki
2c850 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f  ngContext.    */
2c860 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
2c870 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
2c880 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2c890 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2c8a0 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d  e);.    if( (rc=
2c8b0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28  =SQLITE_OK) && (
2c8c0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2c8d0 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  em==NULL) ){.   
2c8e0 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d     char *zSemNam
2c8f0 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  e = pNew->pInode
2c900 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20  ->aSemName;.    
2c910 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73    int n;.      s
2c920 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2c930 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53  MAX_PATHNAME, zS
2c940 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d  emName, "/%s.sem
2c950 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c960 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2c970 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
2c980 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
2c990 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=1; zSemName[n
2c9a0 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
2c9b0 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
2c9c0 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
2c9d0 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
2c9e0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2c9f0 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a  Sem = sem_open(z
2ca00 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54  SemName, O_CREAT
2ca10 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20  , 0666, 1);.    
2ca20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f    if( pNew->pIno
2ca30 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  de->pSem == SEM_
2ca40 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
2ca50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2ca60 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
2ca70 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2ca80 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
2ca90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2caa0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2cab0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2cac0 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  .  storeLastErrn
2cad0 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20  o(pNew, 0);.#if 
2cae0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
2caf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cb00 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
2cb10 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2cb20 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2cb30 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20  ;.    h = -1;.  
2cb40 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65    osUnlink(zFile
2cb50 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  name);.    pNew-
2cb60 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2cb70 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
2cb80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
2cb90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2cba0 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2cbb0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2cbc0 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2cbd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
2cbe0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
2cbf0 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
2cc00 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
2cc10 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69  ;.    verifyDbFi
2cc20 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20  le(pNew);.  }.  
2cc30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2cc40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2cc50 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
2cc60 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
2cc70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
2cc80 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
2cc90 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
2cca0 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
2ccb0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
2ccc0 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
2ccd0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2cce0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2ccf0 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2cd00 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
2cd10 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
2cd20 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c  .     0,.     0,
2cd30 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22  .     "/var/tmp"
2cd40 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70  ,.     "/usr/tmp
2cd50 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  ",.     "/tmp",.
2cd60 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a       0        /*
2cd70 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72   List terminator
2cd80 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67   */.  };.  unsig
2cd90 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ned int i;.  str
2cda0 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
2cdb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2cdc0 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b   = 0;..  azDirs[
2cdd0 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  0] = sqlite3_tem
2cde0 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69  p_directory;.  i
2cdf0 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20  f( !azDirs[1] ) 
2ce00 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
2ce10 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49  nv("SQLITE_TMPDI
2ce20 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  R");.  if( !azDi
2ce30 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32  rs[2] ) azDirs[2
2ce40 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
2ce50 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  IR");.  for(i=0;
2ce60 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
2ce70 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
2ce80 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
2ce90 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20  [i++]){.    if( 
2cea0 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zDir==0 ) contin
2ceb0 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74  ue;.    if( osSt
2cec0 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29  at(zDir, &buf) )
2ced0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2cee0 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
2cef0 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
2cf00 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41  nue;.    if( osA
2cf10 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20  ccess(zDir, 07) 
2cf20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2cf30 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
2cf40 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zDir;.}../*.
2cf50 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
2cf60 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
2cf70 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
2cf80 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
2cf90 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
2cfa0 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
2cfb0 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
2cfc0 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
2cfd0 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
2cfe0 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
2cff0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2d000 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
2d010 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2d020 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2d030 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
2d040 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
2d050 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
2d060 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
2d070 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
2d080 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
2d090 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
2d0a0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
2d0b0 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
2d0c0 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74   *zDir;..  /* It
2d0d0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
2d0e0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
2d0f0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
2d100 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
2d110 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
2d120 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
2d130 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
2d140 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
2d150 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
2d160 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
2d170 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
2d180 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2d190 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
2d1a0 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
2d1b0 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
2d1c0 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20  Dir==0 ) zDir = 
2d1d0 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ".";..  /* Check
2d1e0 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
2d1f0 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
2d200 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
2d210 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
2d220 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
2d230 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
2d240 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
2d250 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e  */.  if( (strlen
2d260 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28  (zDir) + strlen(
2d270 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
2d280 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e  _PREFIX) + 18) >
2d290 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
2d2a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d2b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
2d2c0 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
2d2d0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
2d2e0 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  18, zBuf, "%s/"S
2d2f0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
2d300 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
2d310 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
2d320 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
2d330 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
2d340 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
2d350 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
2d360 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
2d370 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
2d380 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
2d390 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
2d3a0 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
2d3b0 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
2d3c0 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
2d3d0 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20  ;.    zBuf[j+1] 
2d3e0 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f  = 0;.  }while( o
2d3f0 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d  sAccess(zBuf,0)=
2d400 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
2d410 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
2d420 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2d430 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2d440 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2d450 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
2d460 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
2d470 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
2d480 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
2d490 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
2d4a0 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
2d4b0 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
2d4c0 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
2d4d0 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
2d4e0 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
2d4f0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
2d500 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
2d510 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
2d520 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
2d530 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
2d540 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
2d550 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2d560 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
2d570 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
2d580 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
2d590 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
2d5a0 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
2d5b0 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
2d5c0 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
2d5d0 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
2d5e0 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
2d5f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
2d600 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
2d610 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
2d620 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
2d630 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2d640 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
2d650 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
2d660 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
2d670 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
2d680 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
2d690 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
2d6a0 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
2d6b0 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
2d6c0 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
2d6d0 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
2d6e0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
2d6f0 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
2d700 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
2d710 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
2d720 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
2d730 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
2d740 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
2d750 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
2d760 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
2d770 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
2d780 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
2d790 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
2d7a0 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
2d7b0 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
2d7c0 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
2d7d0 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
2d7e0 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
2d7f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2d800 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
2d810 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
2d820 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
2d830 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
2d840 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
2d850 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2d860 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
2d870 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
2d880 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2d890 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
2d8a0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2d8b0 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
2d8c0 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
2d8d0 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2d8e0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
2d8f0 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
2d900 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
2d910 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
2d920 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
2d930 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
2d940 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
2d950 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
2d960 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
2d970 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
2d980 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
2d990 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
2d9a0 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
2d9b0 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
2d9c0 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
2d9d0 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
2d9e0 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
2d9f0 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
2da00 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
2da10 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
2da20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2da30 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
2da40 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20  call */..  /* A 
2da50 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
2da60 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
2da70 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
2da80 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
2da90 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
2daa0 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
2dab0 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
2dac0 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
2dad0 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
2dae0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
2daf0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2db00 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
2db10 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
2db20 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
2db30 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
2db40 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
2db50 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
2db60 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
2db70 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
2db80 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
2db90 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
2dba0 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
2dbb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
2dbc0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
2dbd0 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
2dbe0 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
2dbf0 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
2dc00 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
2dc10 20 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20   for a reusable 
2dc20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2dc30 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a  are not dire.  *
2dc40 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61  /.  if( 0==osSta
2dc50 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29  t(zPath, &sStat)
2dc60 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64   ){.    unixInod
2dc70 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a  eInfo *pInode;..
2dc80 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2dc90 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ex();.    pInode
2dca0 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
2dcb0 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
2dcc0 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  && (pInode->file
2dcd0 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74  Id.dev!=sStat.st
2dce0 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20  _dev.           
2dcf0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e            || pIn
2dd00 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21  ode->fileId.ino!
2dd10 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29  =sStat.st_ino) )
2dd20 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20  {.       pInode 
2dd30 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
2dd40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2dd50 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55  Inode ){.      U
2dd60 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70  nixUnusedFd **pp
2dd70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
2dd80 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
2dd90 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66   *pp && (*pp)->f
2dda0 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d  lags!=flags; pp=
2ddb0 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
2ddc0 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  ;.      pUnused 
2ddd0 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28  = *pp;.      if(
2dde0 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
2ddf0 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65      *pp = pUnuse
2de00 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  d->pNext;.      
2de10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
2de20 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2de30 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69  }.#endif    /* i
2de40 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  f !OS_VXWORKS */
2de50 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65  .  return pUnuse
2de60 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  d;.}../*.** This
2de70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2de80 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  led by unixOpen(
2de90 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  ) to determine t
2dea0 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69  he unix permissi
2deb0 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  ons.** to create
2dec0 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e   new files with.
2ded0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
2dee0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2def0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
2df00 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73  ** and a value s
2df10 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73  uitable for pass
2df20 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64  ing as the third
2df30 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65   argument to ope
2df40 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74  n(2) is.** writt
2df50 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66  en to *pMode. If
2df60 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2df70 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
2df80 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
2df90 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2dfa0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64  e value of *pMod
2dfb0 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65  e is not modifie
2dfc0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74  d..**.** In most
2dfd0 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75   cases, this rou
2dfe0 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65  tine sets *pMode
2dff0 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c   to 0, which wil
2e000 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69  l become.** an i
2e010 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62  ndication to rob
2e020 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72  ust_open() to cr
2e030 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73  eate the file us
2e040 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45  ing.** SQLITE_DE
2e050 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2e060 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20  SSIONS adjusted 
2e070 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  by the umask..**
2e080 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65   But if the file
2e090 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
2e0a0 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61   a WAL or regula
2e0b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
2e0c0 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  then .** this fu
2e0d0 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74  nction queries t
2e0e0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
2e0f0 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  or the permissio
2e100 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f  ns on the .** co
2e110 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
2e120 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65  base file and se
2e130 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69  ts *pMode to thi
2e140 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65  s value. Wheneve
2e150 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20  r .** possible, 
2e160 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  WAL and journal 
2e170 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
2e180 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
2e190 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
2e1a0 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   as the associat
2e1b0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
2e1c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
2e1d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
2e1e0 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73  _NAMES option is
2e1f0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
2e200 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66  he.** original f
2e210 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61  ilename is unava
2e220 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33  ilable.  But 8_3
2e230 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75  _NAMES is only u
2e240 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66  sed for.** FAT f
2e250 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70  ilesystems and p
2e260 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f  ermissions do no
2e270 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20  t matter there, 
2e280 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74  so just use.** t
2e290 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69  he default permi
2e2a0 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssions..*/.stati
2e2b0 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65  c int findCreate
2e2c0 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
2e2d0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2e2f0 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73  ath of file (pos
2e300 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65  sibly) being cre
2e310 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ated */.  int fl
2e320 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2e330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
2e340 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68  gs passed as 4th
2e350 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70   argument to xOp
2e360 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  en() */.  mode_t
2e370 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20   *pMode,        
2e380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2e390 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  : Permissions to
2e3a0 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20   open file with 
2e3b0 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64  */.  uid_t *pUid
2e3c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e3d0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64       /* OUT: uid
2e3e0 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66   to set on the f
2e3f0 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a  ile */.  gid_t *
2e400 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20  pGid            
2e410 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2e420 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   gid to set on t
2e430 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  he file */.){.  
2e440 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2e450 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2e460 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2e470 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a  /.  *pMode = 0;.
2e480 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a    *pUid = 0;.  *
2e490 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  pGid = 0;.  if( 
2e4a0 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
2e4b0 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
2e4c0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2e4d0 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  L) ){.    char z
2e4e0 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  Db[MAX_PATHNAME+
2e4f0 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  1];     /* Datab
2e500 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f  ase file path */
2e510 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20  .    int nDb;   
2e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e530 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e540 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a  valid bytes in z
2e550 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  Db */.    struct
2e560 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
2e570 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
2e580 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64  t of stat() on d
2e590 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e5a0 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73  .    /* zPath is
2e5b0 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c   a path to a WAL
2e5c0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
2e5d0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
2e5e0 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20  block derives.  
2e5f0 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f    ** the path to
2e600 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
2e610 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
2e620 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62  om zPath. This b
2e630 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20  lock handles.   
2e640 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
2e650 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74  g naming convent
2e660 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ions:.    **.   
2e670 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2e680 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20  db>-journal".   
2e690 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2e6a0 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20  db>-wal".    ** 
2e6b0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2e6c0 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a  journalNN".    *
2e6d0 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2e6e0 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a  >-walNN".    **.
2e6f0 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20      ** where NN 
2e700 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d  is a decimal num
2e710 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69  ber. The NN nami
2e720 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a  ng schemes are .
2e730 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
2e740 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65  he test_multiple
2e750 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20  x.c module..    
2e760 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c  */.    nDb = sql
2e770 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2e780 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66  th) - 1; .#ifdef
2e790 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
2e7a0 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69  _3_NAMES.    whi
2e7b0 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c  le( nDb>0 && sql
2e7c0 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74  ite3Isalnum(zPat
2e7d0 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b  h[nDb]) ) nDb--;
2e7e0 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20  .    if( nDb==0 
2e7f0 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  || zPath[nDb]!='
2e800 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  -' ) return SQLI
2e810 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20  TE_OK;.#else.   
2e820 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44   while( zPath[nD
2e830 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  b]!='-' ){.     
2e840 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29   assert( nDb>0 )
2e850 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e860 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27  zPath[nDb]!='\n'
2e870 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b   );.      nDb--;
2e880 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2e890 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
2e8a0 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
2e8b0 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
2e8c0 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  .    if( 0==osSt
2e8d0 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20  at(zDb, &sStat) 
2e8e0 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20  ){.      *pMode 
2e8f0 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20  = sStat.st_mode 
2e900 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70  & 0777;.      *p
2e910 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75  Uid = sStat.st_u
2e920 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20  id;.      *pGid 
2e930 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a  = sStat.st_gid;.
2e940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2e960 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
2e970 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
2e980 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2e990 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b  DELETEONCLOSE ){
2e9a0 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36  .    *pMode = 06
2e9b0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
2e9c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
2e9d0 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74  en the file zPat
2e9e0 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f  h..** .** Previo
2e9f0 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65  usly, the SQLite
2ea00 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74   OS layer used t
2ea10 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  hree functions i
2ea20 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a  n place of this.
2ea30 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ** one:.**.**   
2ea40 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
2ea50 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20  eadWrite();.**  
2ea60 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2ea70 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20  ReadOnly();.**  
2ea80 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2ea90 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a  Exclusive();.**.
2eaa0 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63  ** These calls c
2eab0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
2eac0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
2ead0 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73  nations of flags
2eae0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64  :.**.**     Read
2eaf0 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28  Write() ->     (
2eb00 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
2eb10 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f  TE).**     ReadO
2eb20 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52  nly()  ->     (R
2eb30 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20  EADONLY) .**    
2eb40 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2eb50 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c   -> (READWRITE |
2eb60 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53   CREATE | EXCLUS
2eb70 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  IVE).**.** The o
2eb80 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ld OpenExclusive
2eb90 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f  () accepted a bo
2eba0 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d  olean argument -
2ebb0 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a   "delFlag". If.*
2ebc0 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65  * true, the file
2ebd0 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   was configured 
2ebe0 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  to be automatica
2ebf0 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e  lly deleted when
2ec00 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e   the.** file han
2ec10 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61  dle closed. To a
2ec20 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20  chieve the same 
2ec30 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69  effect using thi
2ec40 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66  s new .** interf
2ec50 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c  ace, add the DEL
2ec60 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20  ETEONCLOSE flag 
2ec70 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
2ec80 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a  ed above for .**
2ec90 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2eca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ecb0 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69  unixOpen(.  sqli
2ecc0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2ecd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ece0 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68  VFS for which th
2ecf0 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20  is is the xOpen 
2ed00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
2ed10 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2ed20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
2ed30 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  name of file to 
2ed40 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
2ed50 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2ed60 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
2ed70 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2ed80 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  or to be filled 
2ed90 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  in */.  int flag
2eda0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2edb0 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c       /* Input fl
2edc0 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  ags to control t
2edd0 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  he opening */.  
2ede0 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
2edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ee00 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74  Output flags ret
2ee10 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
2ee20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  core */.){.  uni
2ee30 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78  xFile *p = (unix
2ee40 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
2ee50 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20  int fd = -1;    
2ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ee70 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2ee80 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70  r returned by op
2ee90 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  en() */.  int op
2eea0 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  enFlags = 0;    
2eeb0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2eec0 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65  s to pass to ope
2eed0 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  n() */.  int eTy
2eee0 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
2eef0 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
2ef00 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
2ef10 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b  */.  int noLock;
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef30 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2ef40 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  mit locking prim
2ef50 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itives */.  int 
2ef60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2ef70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2ef80 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f  nction Return Co
2ef90 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c  de */.  int ctrl
2efa0 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
2efb0 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49         /* UNIXFI
2efc0 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20  LE_* flags */.. 
2efd0 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
2efe0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2eff0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
2f000 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
2f010 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
2f020 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2f030 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
2f040 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
2f050 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2f060 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
2f070 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
2f080 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
2f090 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f0a0 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
2f0b0 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
2f0c0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2f0d0 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
2f0e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2f0f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
2f100 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
2f110 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2f120 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
2f130 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
2f140 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2f150 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
2f160 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2f170 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
2f180 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a  fsInfo;.#endif..
2f190 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
2f1a0 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
2f1b0 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
2f1c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2f1d0 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
2f1e0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
2f1f0 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
2f200 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
2f210 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
2f220 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
2f230 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
2f240 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
2f250 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
2f260 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
2f270 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d  .  int syncDir =
2f280 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
2f290 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
2f2a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
2f2b0 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
2f2c0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f2d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2f2e0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2f2f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
2f300 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
2f310 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
2f320 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
2f330 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
2f340 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
2f350 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
2f360 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
2f370 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
2f380 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
2f390 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
2f3a0 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
2f3b0 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20  _PATHNAME+2];.  
2f3c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2f3d0 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
2f3e0 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
2f3f0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
2f400 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
2f410 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
2f420 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
2f430 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
2f440 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
2f450 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
2f460 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
2f470 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
2f480 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
2f490 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
2f4a0 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
2f4b0 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
2f4c0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
2f4d0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
2f4e0 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
2f4f0 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
2f500 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
2f510 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
2f520 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
2f530 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
2f540 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
2f550 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
2f560 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
2f570 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
2f580 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
2f590 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
2f5a0 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
2f5b0 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
2f5c0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
2f5d0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
2f5e0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
2f5f0 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
2f600 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
2f610 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
2f620 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
2f630 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
2f640 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
2f650 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
2f660 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
2f670 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2f680 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2f690 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2f6a0 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
2f6b0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2f6c0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2f6d0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2f6e0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
2f6f0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2f700 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2f710 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2f720 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2f730 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
2f740 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
2f750 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
2f760 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
2f770 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
2f780 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
2f790 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
2f7a0 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
2f7b0 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
2f7c0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
2f7d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
2f7e0 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
2f7f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
2f800 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
2f810 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f820 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2f830 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f840 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
2f850 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
2f860 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f870 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
2f880 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f890 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2f8a0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
2f8b0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f8c0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
2f8d0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f8e0 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
2f8f0 2f 2a 20 44 65 74 65 63 74 20 61 20 70 69 64 20  /* Detect a pid 
2f900 63 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74  change and reset
2f910 20 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72   the PRNG.  Ther
2f920 65 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  e is a race cond
2f930 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20  ition.  ** here 
2f940 73 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72  such that two or
2f950 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c   more threads al
2f960 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  l trying to open
2f970 20 64 61 74 61 62 61 73 65 73 20 61 74 0a 20 20   databases at.  
2f980 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74  ** the same inst
2f990 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65  ant might all re
2f9a0 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42  set the PRNG.  B
2f9b0 75 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65  ut multiple rese
2f9c0 74 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d  ts.  ** are harm
2f9d0 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  less..  */.  if(
2f9e0 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d   randomnessPid!=
2f9f0 6f 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20  osGetpid(0) ){. 
2fa00 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64     randomnessPid
2fa10 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a   = osGetpid(0);.
2fa20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2fa30 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d  omness(0,0);.  }
2fa40 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
2fa50 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
2fa60 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  ));..  if( eType
2fa70 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2fa80 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69  IN_DB ){.    Uni
2fa90 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2faa0 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  ed;.    pUnused 
2fab0 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
2fac0 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
2fad0 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2fae0 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55  ){.      fd = pU
2faf0 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d  nused->fd;.    }
2fb00 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75  else{.      pUnu
2fb10 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
2fb20 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e  lloc(sizeof(*pUn
2fb30 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
2fb40 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
2fb50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2fb60 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2fb70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2fb80 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
2fb90 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62  d;..    /* Datab
2fba0 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
2fbb0 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
2fbc0 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
2fbd0 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20   are not.    ** 
2fbe0 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65  URIs with parame
2fbf0 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ters.  Hence, th
2fc00 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65  ey can always be
2fc10 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20   passed into.   
2fc20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
2fc30 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a  parameter(). */.
2fc40 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
2fc50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2fc60 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73  _URI) || zName[s
2fc70 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
2fc80 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69  =0 );..  }else i
2fc90 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
2fca0 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2fcb0 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20  NULL, the upper 
2fcc0 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74  layer is request
2fcd0 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
2fce0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69   */.    assert(i
2fcf0 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63  sDelete && !sync
2fd00 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  Dir);.    rc = u
2fd10 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d  nixGetTempname(M
2fd20 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a  AX_PATHNAME+2, z
2fd30 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
2fd40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fd50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2fd60 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
2fd70 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
2fd80 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
2fd90 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2fda0 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73  names are always
2fdb0 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
2fdc0 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66  minated.    ** f
2fdd0 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65  or use by sqlite
2fde0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
2fdf0 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ). */.    assert
2fe00 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a  ( zName[strlen(z
2fe10 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20  Name)+1]==0 );. 
2fe20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69   }..  /* Determi
2fe30 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ne the value of 
2fe40 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2fe50 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f  ter passed to PO
2fe60 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  SIX function.  *
2fe70 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20  * open(). These 
2fe80 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74  must be calculat
2fe90 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28  ed even if open(
2fea0 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c  ) is not called,
2feb0 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61   as.  ** they ma
2fec0 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70  y be stored as p
2fed0 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
2fee0 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20  handle and used 
2fef0 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f  by the .  ** 'co
2ff00 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e  nch file' lockin
2ff10 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65  g functions late
2ff20 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  r on.  */.  if( 
2ff30 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70  isReadonly )  op
2ff40 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
2ff50 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61  NLY;.  if( isRea
2ff60 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61  dWrite ) openFla
2ff70 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20  gs |= O_RDWR;.  
2ff80 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20  if( isCreate )  
2ff90 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2ffa0 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73  _CREAT;.  if( is
2ffb0 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e  Exclusive ) open
2ffc0 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c  Flags |= (O_EXCL
2ffd0 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20  |O_NOFOLLOW);.  
2ffe0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
2fff0 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
30000 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30  RY);..  if( fd<0
30010 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f   ){.    mode_t o
30020 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  penMode;        
30030 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73        /* Permiss
30040 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66  ions to create f
30050 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20  ile with */.    
30060 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20  uid_t uid;      
30070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30080 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20   Userid for the 
30090 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f  file */.    gid_
300a0 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  t gid;          
300b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f            /* Gro
300c0 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  upid for the fil
300d0 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69  e */.    rc = fi
300e0 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
300f0 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26  (zName, flags, &
30100 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20  openMode, &uid, 
30110 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72  &gid);.    if( r
30120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
30140 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20  ->pUnused );.   
30150 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
30160 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
30170 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
30180 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
30190 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65  RNAL );.      re
301a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
301b0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
301c0 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
301d0 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
301e0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
301f0 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30  PENX   %-3d %s 0
30200 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65  %o\n", fd, zName
30210 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20  , openFlags));. 
30220 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
30230 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20  rrno!=EISDIR && 
30240 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
30250 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
30260 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74       /* Failed t
30270 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
30280 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
30290 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d  ccess. Try read-
302a0 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66  only. */.      f
302b0 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
302c0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
302d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
302e0 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  TE);.      openF
302f0 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52  lags &= ~(O_RDWR
30300 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20  |O_CREAT);.     
30310 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
30320 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
30330 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
30340 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20  |= O_RDONLY;.   
30350 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20     isReadonly = 
30360 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f  1;.      fd = ro
30370 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
30380 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
30390 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mode);.    }.   
303a0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
303b0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
303c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
303d0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
303e0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
303f0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
30400 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hed;.    }..    
30410 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65  /* If this proce
30420 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73  ss is running as
30430 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65   root and if cre
30440 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c  ating a new roll
30450 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
30460 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c  nal or WAL file,
30470 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68   set the ownersh
30480 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ip of the journa
30490 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20  l or WAL to be. 
304a0 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61     ** the same a
304b0 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
304c0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
304d0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
304e0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
304f0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
30500 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
30510 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c      osFchown(fd,
30520 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20   uid, gid);.    
30530 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
30540 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
30550 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
30560 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
30570 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
30580 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ->pUnused ){.   
30590 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20   p->pUnused->fd 
305a0 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e  = fd;.    p->pUn
305b0 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
305c0 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
305d0 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
305e0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
305f0 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
30600 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
30610 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f  TE_UNLINK_AFTER_
30620 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61 74 68  CLOSE).    zPath
30630 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
30640 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  tf("%s", zName);
30650 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  .    if( zPath==
30660 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
30670 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
30680 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
30690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
306a0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  MEM;.    }.#else
306b0 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e  .    osUnlink(zN
306c0 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
306d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
306e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
306f0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e  .  else{.    p->
30700 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
30710 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69  Flags;.  }.#endi
30720 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54  f..  noLock = eT
30730 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
30740 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69  _MAIN_DB;..  .#i
30750 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
30760 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
30770 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
30780 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74 66  YLE.  if( fstatf
30790 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
307a0 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f 72  = -1 ){.    stor
307b0 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20 65 72  eLastErrno(p, er
307c0 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74  rno);.    robust
307d0 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
307e0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74  LINE__);.    ret
307f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
30800 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69  _ACCESS;.  }.  i
30810 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
30820 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e  "msdos", fsInfo.
30830 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
30840 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
30850 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
30860 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
30870 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
30880 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
30890 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c 20  trncmp("exfat", 
308a0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
308b0 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
308c0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
308d0 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
308e0 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
308f0 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69  MSDOS;.  }.#endi
30900 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 61  f..  /* Set up a
30910 70 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c 46  ppropriate ctrlF
30920 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69 73  lags */.  if( is
30930 44 65 6c 65 74 65 20 29 20 20 20 20 20 20 20 20  Delete )        
30940 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
30950 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
30960 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52 65  LETE;.  if( isRe
30970 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20 20  adonly )        
30980 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
30990 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  |= UNIXFILE_RDON
309a0 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  LY;.  if( noLock
309b0 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
309c0 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
309d0 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
309e0 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72 20  ;.  if( syncDir 
309f0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
30a00 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
30a10 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b  NIXFILE_DIRSYNC;
30a20 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
30a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29  QLITE_OPEN_URI )
30a40 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
30a50 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66  IXFILE_URI;..#if
30a60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
30a70 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66  OCKING_STYLE.#if
30a80 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
30a90 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69  ROXY_LOCKING.  i
30aa0 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a  sAutoProxy = 1;.
30ab0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41  #endif.  if( isA
30ac0 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61  utoProxy && (zPa
30ad0 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e  th!=NULL) && (!n
30ae0 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e  oLock) && pVfs->
30af0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  xOpen ){.    cha
30b00 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65  r *envforce = ge
30b10 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52  tenv("SQLITE_FOR
30b20 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
30b30 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50  ");.    int useP
30b40 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  roxy = 0;..    /
30b50 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  * SQLITE_FORCE_P
30b60 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20  ROXY_LOCKING==1 
30b70 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61  means force alwa
30b80 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20  ys use proxy, 0 
30b90 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65  means .    ** ne
30ba0 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e  ver use proxy, N
30bb0 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72  ULL means use pr
30bc0 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61  oxy for non-loca
30bd0 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a  l files only.  *
30be0 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72  /.    if( envfor
30bf0 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ce!=NULL ){.    
30c00 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f    useProxy = ato
30c10 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20  i(envforce)>0;. 
30c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30c30 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49  useProxy = !(fsI
30c40 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
30c50 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  LOCAL);.    }.  
30c60 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29    if( useProxy )
30c70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c  {.      rc = fil
30c80 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
30c90 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  , fd, pFile, zPa
30ca0 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a  th, ctrlFlags);.
30cb0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30cd0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
30ce0 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28  nsformUnixFile((
30cf0 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c  unixFile*)pFile,
30d00 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20   ":auto:");.    
30d10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30d20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30d30 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c     /* Use unixCl
30d40 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  ose to clean up 
30d50 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64  the resources ad
30d60 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69  ded in fillInUni
30d70 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20  xFile .         
30d80 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c   ** and clear al
30d90 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27  l the structure'
30da0 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53  s references.  S
30db0 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20  pecifically, .  
30dc0 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65          ** pFile
30dd0 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20  ->pMethods will 
30de0 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74  be NULL so sqlit
30df0 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62  e3OsClose will b
30e00 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20  e a no-op .     
30e10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30e20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c    unixClose(pFil
30e30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
30e40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
30e50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
30e60 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
30e70 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  hed;.    }.  }.#
30e80 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20  endif.  .  rc = 
30e90 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
30ea0 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20  Vfs, fd, pFile, 
30eb0 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73  zPath, ctrlFlags
30ec0 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65  );..open_finishe
30ed0 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
30ee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
30ef0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55  lite3_free(p->pU
30f00 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65  nused);.  }.  re
30f10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
30f20 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
30f30 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  le at zPath. If 
30f40 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
30f50 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73  ment is true, fs
30f60 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72  ync().** the dir
30f70 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
30f80 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a  eting the file..
30f90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
30fa0 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  ixDelete(.  sqli
30fb0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
30fc0 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e  ,     /* VFS con
30fd0 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20  taining this as 
30fe0 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68  the xDelete meth
30ff0 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
31000 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
31010 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
31020 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
31030 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63  */.  int dirSync
31040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31050 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63  * If true, fsync
31060 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  () directory aft
31070 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65  er deleting file
31080 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
31090 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55  = SQLITE_OK;.  U
310a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
310b0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
310c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
310d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
310e0 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f  DELETE);.  if( o
310f0 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d  sUnlink(zPath)==
31100 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20  (-1) ){.    if( 
31110 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69  errno==ENOENT.#i
31120 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
31130 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73 73       || osAccess
31140 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e  (zPath,0)!=0.#en
31150 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
31160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
31170 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
31180 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31190 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
311a0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
311b0 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b  _DELETE, "unlink
311c0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
311d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
311e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
311f0 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
31200 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e  NC.  if( (dirSyn
31210 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20  c & 1)!=0 ){.   
31220 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
31230 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
31240 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
31250 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31260 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56  E_OK ){.#if OS_V
31270 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28  XWORKS.      if(
31280 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29   fsync(fd)==-1 )
31290 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
312a0 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e   fsync(fd) ).#en
312b0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
312c0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
312d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
312e0 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66  RR_DIR_FSYNC, "f
312f0 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20  sync", zPath);. 
31300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62       }.      rob
31310 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
31320 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
31330 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
31340 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
31350 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
31360 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
31370 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
31380 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
31390 73 74 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  st the existence
313a0 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
313b0 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
313c0 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
313d0 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
313e0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
313f0 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
31400 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
31410 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
31420 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
31430 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
31440 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
31450 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
31460 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
31470 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
31480 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
31490 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
314a0 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
314b0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
314c0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
314d0 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
314e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
314f0 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
31500 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
31510 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
31520 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
31530 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
31540 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
31550 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
31560 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
31570 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
31580 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
31590 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
315a0 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
315b0 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
315c0 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
315d0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
315e0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
315f0 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
31600 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
31610 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
31620 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
31630 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
31640 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
31650 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
31660 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
31670 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
31680 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
31690 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
316a0 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
316b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
316c0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
316d0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
316e0 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
316f0 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
31700 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
31710 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
31720 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
31730 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
31740 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
31750 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
31760 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
31770 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
31780 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63  pResOut = (osAcc
31790 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65  ess(zPath, amode
317a0 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61  )==0);.  if( fla
317b0 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
317c0 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65  S_EXISTS && *pRe
317d0 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75  sOut ){.    stru
317e0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
317f0 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
31800 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62  Path, &buf) && b
31810 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
31820 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20  .      *pResOut 
31830 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
31840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31850 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
31860 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
31870 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
31880 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
31890 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
318a0 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
318b0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
318c0 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
318d0 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
318e0 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
318f0 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
31900 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
31910 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
31920 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
31930 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
31940 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
31950 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
31960 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
31970 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
31980 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
31990 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
319a0 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
319b0 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
319c0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
319d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
319e0 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
319f0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
31a00 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
31a10 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
31a20 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
31a30 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
31a40 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
31a50 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
31a60 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
31a70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
31a80 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
31a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31aa0 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
31ab0 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .){..  /* It's o
31ac0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
31ad0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
31ae0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
31af0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
31b00 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
31b10 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
31b20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
31b30 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
31b40 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
31b50 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
31b60 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
31b70 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
31b80 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
31b90 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
31ba0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
31bb0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
31bc0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
31bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
31be0 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
31bf0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
31c00 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
31c10 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
31c20 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
31c30 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20   zOut[nOut-1] = 
31c40 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74  '\0';.  if( zPat
31c50 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[0]=='/' ){.   
31c60 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
31c70 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
31c80 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
31c90 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
31ca0 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  d;.    if( osGet
31cb0 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  cwd(zOut, nOut-1
31cc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
31cd0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
31ce0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
31cf0 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
31d00 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
31d10 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29      nCwd = (int)
31d20 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
31d30 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
31d40 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
31d50 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
31d60 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
31d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31d80 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
31d90 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
31da0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
31db0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
31dc0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
31dd0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
31de0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
31df0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
31e00 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
31e10 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
31e20 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
31e30 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
31e40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
31e50 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
31e60 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
31e70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
31e80 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
31e90 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
31ea0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
31eb0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
31ec0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
31ed0 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
31ee0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
31ef0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
31f00 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
31f10 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
31f20 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
31f30 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
31f40 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
31f50 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
31f60 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
31f70 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
31f80 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
31f90 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
31fa0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
31fb0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
31fc0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
31fd0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
31fe0 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
31ff0 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
32000 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
32010 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
32020 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
32030 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
32040 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
32050 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
32060 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
32070 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32080 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
32090 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
320a0 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
320b0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
320c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
320d0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
320e0 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
320f0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
32100 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
32110 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
32120 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
32130 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
32140 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
32150 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
32160 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
32170 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
32180 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
32190 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
321a0 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
321b0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
321c0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
321d0 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
321e0 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
321f0 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
32200 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
32210 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
32220 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
32230 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
32240 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
32250 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
32260 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
32270 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
32280 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
32290 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
322a0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
322b0 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
322c0 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
322d0 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
322e0 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
322f0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
32300 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
32310 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
32320 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
32330 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
32340 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
32350 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
32360 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
32370 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
32380 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
32390 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
323a0 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
323b0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
323c0 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
323d0 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
323e0 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
323f0 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
32400 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
32410 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
32420 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
32430 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
32440 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
32450 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
32460 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
32470 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
32480 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
32490 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
324a0 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
324b0 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
324c0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
324d0 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
324e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
324f0 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
32500 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
32510 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
32520 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
32530 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
32540 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
32550 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
32560 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
32570 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
32580 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
32590 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
325a0 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
325b0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
325c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
325d0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
325e0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
325f0 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
32600 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
32610 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
32620 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
32630 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
32640 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
32650 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
32660 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
32670 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
32680 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
32690 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
326a0 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
326b0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
326c0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
326d0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
326e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
326f0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
32700 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
32710 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
32720 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
32730 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
32740 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
32750 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
32760 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
32770 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
32780 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
32790 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
327a0 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
327b0 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
327c0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
327d0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
327e0 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
327f0 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
32800 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
32810 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
32820 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
32830 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
32840 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
32850 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
32860 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
32870 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
32880 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
32890 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
328a0 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
328b0 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
328c0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
328d0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
328e0 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
328f0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
32900 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
32910 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
32920 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
32930 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
32940 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
32950 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
32960 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
32970 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
32980 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
32990 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
329a0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
329b0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
329c0 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
329d0 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a   osGetpid(0);  .
329e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
329f0 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20  ITE_TEST).  {.  
32a00 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a 20    int fd, got;. 
32a10 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
32a20 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
32a30 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  m", O_RDONLY, 0)
32a40 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
32a50 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
32a60 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
32a70 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
32a80 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
32a90 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  t));.      memcp
32aa0 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74  y(&zBuf[sizeof(t
32ab0 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73 50  )], &randomnessP
32ac0 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f  id, sizeof(rando
32ad0 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20 20  mnessPid));.    
32ae0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
32af0 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64 6f  (t)+sizeof(rando
32b00 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a 65  mnessPid)<=(size
32b10 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
32b20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
32b30 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f  ) + sizeof(rando
32b40 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20 7d  mnessPid);.    }
32b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20  else{.      do{ 
32b60 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c  got = osRead(fd,
32b70 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77   zBuf, nBuf); }w
32b80 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
32b90 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
32ba0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
32bb0 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
32bc0 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  _);.    }.  }.#e
32bd0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42  ndif.  return nB
32be0 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c  uf;.}.../*.** Sl
32bf0 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
32c00 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
32c10 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
32c20 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65  me slept..** The
32c30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
32c40 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
32c50 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20  seconds we want 
32c60 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65  to sleep..** The
32c70 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
32c80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
32c90 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73  icroseconds of s
32ca0 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  leep actually.**
32cb0 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
32cc0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
32cd0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c  perating system,
32ce0 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a   a number which.
32cf0 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61  ** might be grea
32d00 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
32d10 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e  l to the argumen
32d20 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a  t, but not less.
32d30 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75  ** than the argu
32d40 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
32d50 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71  int unixSleep(sq
32d60 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
32d70 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  ed, int microsec
32d80 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58  onds){.#if OS_VX
32d90 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
32da0 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73  imespec sp;..  s
32db0 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f  p.tv_sec = micro
32dc0 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30  seconds / 100000
32dd0 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20  0;.  sp.tv_nsec 
32de0 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  = (microseconds 
32df0 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30  % 1000000) * 100
32e00 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26  0;.  nanosleep(&
32e10 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55  sp, NULL);.  UNU
32e20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32e30 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
32e40 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
32e50 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  elif defined(HAV
32e60 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
32e70 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65  E_USLEEP.  uslee
32e80 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b  p(microseconds);
32e90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32ea0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32eb0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
32ec0 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  nds;.#else.  int
32ed0 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72   seconds = (micr
32ee0 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29  oseconds+999999)
32ef0 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65  /1000000;.  slee
32f00 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  p(seconds);.  UN
32f10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32f20 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
32f30 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
32f40 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
32f50 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
32f60 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
32f70 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
32f80 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
32f90 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
32fa0 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
32fb0 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
32fc0 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
32fd0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
32fe0 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
32ff0 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
33000 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
33010 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
33020 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
33030 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
33040 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
33050 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
33060 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
33070 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
33080 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
33090 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
330a0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
330b0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
330c0 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
330d0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
330e0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
330f0 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
33100 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
33110 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
33120 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
33130 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
33140 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
33150 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
33160 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
33170 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
33180 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
33190 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
331a0 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
331b0 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
331c0 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
331d0 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
331e0 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
331f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
33200 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
33210 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
33220 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
33230 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
33240 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
33250 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
33260 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
33270 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20  iNow){.  static 
33280 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
33290 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
332a0 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
332b0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
332c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
332d0 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e  TE_OK;.#if defin
332e0 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20  ed(NO_GETTOD).  
332f0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
33300 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  (&t);.  *piNow =
33310 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ((sqlite3_int64
33320 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45  )t)*1000 + unixE
33330 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56  poch;.#elif OS_V
33340 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
33350 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20  timespec sNow;. 
33360 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43   clock_gettime(C
33370 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26  LOCK_REALTIME, &
33380 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  sNow);.  *piNow 
33390 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
333a0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
333b0 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
333c0 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30  sNow.tv_nsec/100
333d0 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74  0000;.#else.  st
333e0 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
333f0 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d 65  w;.  if( gettime
33400 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d  ofday(&sNow, 0)=
33410 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  =0 ){.    *piNow
33420 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
33430 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
33440 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
33450 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30   sNow.tv_usec/10
33460 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
33470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
33480 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  OR;.  }.#endif..
33490 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
334a0 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
334b0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
334c0 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
334d0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
334e0 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
334f0 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
33500 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
33510 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
33520 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
33530 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33540 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
33550 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
33560 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
33570 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
33580 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
33590 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
335a0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
335b0 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
335c0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
335d0 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
335e0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
335f0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
33600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
33610 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
33620 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
33630 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
33640 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ow){.  sqlite3_i
33650 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e  nt64 i = 0;.  in
33660 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t rc;.  UNUSED_P
33670 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33680 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75  );.  rc = unixCu
33690 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30  rrentTimeInt64(0
336a0 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  , &i);.  *prNow 
336b0 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
336c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
336d0 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74  /*.** We added t
336e0 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  he xGetLastError
336f0 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74  () method with t
33700 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20  he intention of 
33710 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74  providing.** bet
33720 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72  ter low-level er
33730 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65  ror messages whe
33740 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74  n operating-syst
33750 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65  em problems come
33760 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51   up.** during SQ
33770 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Lite operation. 
33780 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e   But so far, non
33790 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65  e of that has be
337a0 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  en implemented.*
337b0 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20  * in the core.  
337c0 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  So this routine 
337d0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
337e0 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73    For now, it is
337f0 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61   merely.** a pla
33800 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74  ce-holder..*/.st
33810 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
33820 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
33830 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
33840 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68  int NotUsed2, ch
33850 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20  ar *NotUsed3){. 
33860 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
33870 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e  R(NotUsed);.  UN
33880 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
33890 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53  otUsed2);.  UNUS
338a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
338b0 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e  Used3);.  return
338c0 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a   0;.}.../*.*****
338d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
338e0 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74  *** End of sqlit
338f0 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
33900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
33920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
33970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
339c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339d0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f  ****** Begin Pro
339e0 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  xy Locking *****
339f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
33a10 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
33a20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69  is a "uber-locki
33a30 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  ng-method" in th
33a40 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73  is sense:  It us
33a50 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  es the.** other 
33a60 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
33a70 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63  on secondary loc
33a80 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20  k files.  Proxy 
33a90 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20  locking is a.** 
33aa0 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20  meta-layer over 
33ab0 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69  top of the primi
33ac0 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  tive locking imp
33ad0 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20  lemented above. 
33ae0 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61   For.** this rea
33af0 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
33b00 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
33b10 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s of proxy locki
33b20 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a  ng is deferred.*
33b30 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20  * until late in 
33b40 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20  the file (here) 
33b50 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  after all of the
33b60 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f   other I/O metho
33b70 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  ds have.** been 
33b80 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61  defined - so tha
33b90 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  t the primitive 
33ba0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
33bb0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  are available.**
33bc0 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20   as services to 
33bd0 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d  help with the im
33be0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
33bf0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
33c00 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  *.****.**.** The
33c10 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
33c20 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69   schemes in SQLi
33c30 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67  te use byte-rang
33c40 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a  e locks on the.*
33c50 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
33c60 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61  to coordinate sa
33c70 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61  fe, concurrent a
33c80 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
33c90 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64  e readers.** and
33ca0 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f   writers [http:/
33cb0 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b  /sqlite.org/lock
33cc0 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68  ingv3.html].  Th
33cd0 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b  e five file lock
33ce0 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55  ing.** states (U
33cf0 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47  NLOCKED, PENDING
33d00 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
33d10 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61  ED, EXCLUSIVE) a
33d20 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  re implemented.*
33d30 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20  * as POSIX read 
33d40 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76  & write locks ov
33d50 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20  er fixed set of 
33d60 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66  locations (via f
33d70 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50  sctl),.** on AFP
33d80 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78   and SMB only ex
33d90 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
33da0 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61  ge locks are ava
33db0 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c  ilable via fsctl
33dc0 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27  .** with _IOWR('
33dd0 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
33de0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
33df0 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61   to track the sa
33e00 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20  me 5 states..** 
33e10 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f  To simulate a F_
33e20 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61  RDLCK on the sha
33e30 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46  red range, on AF
33e40 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c  P a randomly sel
33e50 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73  ected.** address
33e60 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   in the shared r
33e70 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
33e80 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  r a SHARED lock,
33e90 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73   the entire.** s
33ea0 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
33eb0 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c  aken for an EXCL
33ec0 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a  USIVE lock):.**.
33ed0 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f  **      PENDING_
33ee0 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30  BYTE        0x40
33ef0 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52  000000.**      R
33f00 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
33f10 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
33f20 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
33f30 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
33f40 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
33f50 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
33f60 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
33f70 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
33f80 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
33f90 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
33fa0 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
33fb0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
33fc0 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
33fd0 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
33fe0 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
33ff0 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
34000 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
34010 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
34020 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
34030 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
34040 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
34050 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
34060 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
34070 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
34080 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
34090 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
340a0 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
340b0 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
340c0 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
340d0 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
340e0 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
340f0 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
34100 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
34110 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
34120 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
34130 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
34140 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
34150 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
34160 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
34170 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
34180 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
34190 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
341a0 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
341b0 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
341c0 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
341d0 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
341e0 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
341f0 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
34200 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
34210 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
34220 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
34230 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
34240 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
34250 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
34260 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
34270 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
34280 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
34290 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
342a0 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
342b0 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
342c0 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
342d0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
342e0 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
342f0 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
34300 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
34310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
34320 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
34330 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
34340 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
34350 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
34360 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
34370 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
34380 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79            <proxy
34390 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a  _path> | ":auto:
343a0 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  ");.**  sqlite3_
343b0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
343c0 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
343d0 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52  FCNTL_GET_LOCKPR
343e0 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34400 20 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29    &<proxy_path>)
34410 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
34420 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
34430 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
34440 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
34450 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
34460 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
34470 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
34480 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
34490 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
344a0 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
344b0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
344c0 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
344d0 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
344e0 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
344f0 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
34500 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
34510 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
34520 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
34530 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
34540 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
34550 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
34560 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
34570 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
34580 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
34590 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
345a0 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
345b0 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
345c0 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
345d0 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
345e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
345f0 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
34600 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
34610 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
34620 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
34630 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
34640 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
34650 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
34660 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
34670 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
34680 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
34690 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
346a0 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
346b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
346c0 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
346d0 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
346e0 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
346f0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
34700 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
34710 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
34720 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
34730 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
34740 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
34750 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
34760 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
34770 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
34780 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
34790 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
347a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
347b0 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
347c0 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
347d0 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
347e0 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
347f0 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
34800 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
34810 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
34820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34830 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
34840 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
34850 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
34860 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
34870 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
34880 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
34890 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
348a0 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
348b0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
348c0 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
348d0 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
348e0 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
348f0 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
34900 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
34910 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
34920 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
34930 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
34940 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
34950 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
34960 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
34970 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
34980 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
34990 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
349a0 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
349b0 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
349c0 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
349d0 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
349e0 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
349f0 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
34a00 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
34a10 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
34a20 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
34a30 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
34a40 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
34a50 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
34a60 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
34a70 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
34a80 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
34a90 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 73  ot exist, or its
34aa0 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
34ab0 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f   match the.** ho
34ac0 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f  st ID and/or pro
34ad0 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68  xy path, then th
34ae0 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61  e lock is escala
34af0 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73  ted to an exclus
34b00 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20  ive.** lock and 
34b10 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  the conch file c
34b20 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74  ontents is updat
34b30 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74  ed with the host
34b40 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a   ID and proxy.**
34b50 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f   path and the lo
34b60 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64  ck is downgraded
34b70 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
34b80 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65  k again.  If the
34b90 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c   conch.** is hel
34ba0 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f  d by another pro
34bb0 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61  cess (with a sha
34bc0 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65  red lock), the e
34bd0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
34be0 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53   will fail and S
34bf0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
34c00 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
34c10 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61  e proxy file - a
34c20 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c   single-byte fil
34c30 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61  e used for all a
34c40 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63  dvisory file loc
34c50 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74  ks.** normally t
34c60 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
34c70 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69  base file.   Thi
34c80 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66  s allows for saf
34c90 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20  e sharing.** of 
34ca0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34cb0 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72  e for multiple r
34cc0 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
34cd0 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  rs on the same.*
34ce0 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63  * host (the conc
34cf0 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  h ensures that t
34d00 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20  hey all use the 
34d10 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  same local lock 
34d20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71  file)..**.** Req
34d30 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b  uesting the lock
34d40 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20   proxy does not 
34d50 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65  immediately take
34d60 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69   the conch, it i
34d70 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  s.** only taken 
34d80 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72  when the first r
34d90 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64  equest to lock d
34da0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
34db0 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20  made.  .** This 
34dc0 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61  matches the sema
34dd0 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61  ntics of the tra
34de0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
34df0 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65   behavior, where
34e00 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f  .** opening a co
34e10 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61  nnection to a da
34e20 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73  tabase file does
34e30 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b   not take a lock
34e40 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73   on it..** The s
34e50 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61  hared lock and a
34e60 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  n open file desc
34e70 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74  riptor are maint
34e80 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20  ained until .** 
34e90 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
34ea0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
34eb0 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a  s closed. .**.**
34ec0 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
34ed0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  and the lock fil
34ee0 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65  e are never dele
34ef0 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79  ted so they only
34f00 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63   need.** to be c
34f10 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74  reated the first
34f20 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75   time they are u
34f30 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  sed..**.** Confi
34f40 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
34f50 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
34f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
34f70 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
34f80 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a  ROXY_LOCKING.**.
34f90 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73  **       Databas
34fa0 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64  e files accessed
34fb0 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69   on non-local fi
34fc0 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a  le systems are.*
34fd0 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69  *       automati
34fe0 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  cally configured
34ff0 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
35000 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  ng, lock files a
35010 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  re.**       name
35020 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
35030 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c  using the same l
35040 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20  ogic as.**      
35050 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f   PRAGMA lock_pro
35060 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22  xy_file=":auto:"
35070 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49  .**    .**  SQLI
35080 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a  TE_PROXY_DEBUG.*
35090 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c  *.**       Enabl
350a0 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f  es the logging o
350b0 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  f error messages
350c0 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20   during host id 
350d0 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65  file.**       re
350e0 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61  trieval and crea
350f0 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
35100 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
35110 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
35120 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
35130 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
35140 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
35150 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
35160 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
35170 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
35180 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
35190 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
351a0 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
351b0 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
351c0 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
351d0 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
351e0 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
351f0 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
35200 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
35210 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
35220 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
35230 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
35240 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
35250 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
35260 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
35270 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
35280 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
35290 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
352a0 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
352b0 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
352c0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
352d0 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
352e0 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
352f0 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
35300 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
35310 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
35320 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
35330 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
35340 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
35350 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
35360 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
35370 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
35380 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67 20 74 68  citly calling th
35390 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
353a0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
353b0 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71   pragma or.** sq
353c0 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  lite_file_contro
353d0 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66  l API is not aff
353e0 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f  ected by SQLITE_
353f0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
35400 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ING)..*/../*.** 
35410 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
35420 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
35430 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69  on MacOSX .*/.#i
35440 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
35450 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
35460 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
35470 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  YLE../*.** The p
35480 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35490 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20  xt has the path 
354a0 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75  and file structu
354b0 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f  res for the remo
354c0 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c  te .** and local
354d0 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20   proxy files in 
354e0 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  it.*/.typedef st
354f0 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
35500 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f  gContext proxyLo
35510 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
35520 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
35530 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69  gContext {.  uni
35540 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
35550 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
35560 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  n conch file */.
35570 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c    char *conchFil
35580 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  ePath;         /
35590 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
355a0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  nch file */.  un
355b0 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
355c0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  y;         /* Op
355d0 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  en proxy lock fi
355e0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
355f0 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20  ckProxyPath;    
35600 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
35610 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
35620 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  ile */.  char *d
35630 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
35640 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
35650 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
35660 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c  /.  int conchHel
35670 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
35680 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e   /* 1 if the con
35690 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69  ch is held, -1 i
356a0 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  f lockless */.  
356b0 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20 20 20  int nFails;     
356c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
356d0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63 68 20  Number of conch 
356e0 74 61 6b 69 6e 67 20 66 61 69 6c 75 72 65 73 20  taking failures 
356f0 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
35700 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
35710 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
35720 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
35730 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
35740 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
35750 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
35760 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
35770 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
35780 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
35790 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  e */.};../* .** 
357a0 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  The proxy lock f
357b0 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65  ile path for the
357c0 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50   database at dbP
357d0 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69  ath is written i
357e0 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77  nto lPath, .** w
357f0 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20  hich must point 
35800 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62  to valid, writab
35810 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20  le memory large 
35820 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78  enough for a max
35830 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69  Len length.** fi
35840 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61  le path. .*/.sta
35850 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
35860 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
35870 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
35880 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
35890 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
358a0 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
358b0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
358c0 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
358d0 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
358e0 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
358f0 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
35900 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
35910 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
35920 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28  _DIR.  {.    if(
35930 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41   !confstr(_CS_DA
35940 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
35950 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
35960 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  n) ){.      OSTR
35970 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
35980 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72  H  failed %s err
35990 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  no=%d pid=%d\n",
359a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
359b0 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 6f 73  lPath, errno, os
359c0 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20  Getpid(0)));.   
359d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
359e0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
359f0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
35a00 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
35a10 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
35a20 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
35a30 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
35a40 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
35a50 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
35a60 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
35a70 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
35a80 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
35a90 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
35aa0 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
35ab0 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
35ac0 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
35ad0 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
35ae0 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
35af0 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
35b00 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
35b10 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
35b20 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
35b30 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
35b40 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
35b50 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
35b60 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
35b70 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
35b80 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
35b90 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
35ba0 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
35bb0 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
35bc0 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
35bd0 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
35be0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
35bf0 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  th, osGetpid(0))
35c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
35c10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a  TE_OK;.}../* . *
35c20 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f  * Creates the lo
35c30 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20  ck file and any 
35c40 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72  missing director
35c50 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a  ies in lockPath.
35c60 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
35c70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
35c80 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c  th(const char *l
35c90 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20  ockPath){.  int 
35ca0 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62  i, len;.  char b
35cb0 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  uf[MAXPATHLEN];.
35cc0 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b    int start = 0;
35cd0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63  .  .  assert(loc
35ce0 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20  kPath!=NULL);.  
35cf0 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  /* try to create
35d00 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65   all the interme
35d10 64 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65  diate directorie
35d20 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e  s */.  len = (in
35d30 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74  t)strlen(lockPat
35d40 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c  h);.  buf[0] = l
35d50 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f  ockPath[0];.  fo
35d60 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69  r( i=1; i<len; i
35d70 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  ++ ){.    if( lo
35d80 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27  ckPath[i] == '/'
35d90 20 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e   && (i - start >
35da0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
35db0 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65  only mkdir if le
35dc0 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72  af dir != "." or
35dd0 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a   "/" or ".." */.
35de0 20 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72        if( i-star
35df0 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d  t>2 || (i-start=
35e00 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =1 && buf[start]
35e10 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
35e20 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20  tart] != '/') . 
35e30 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74          || (i-st
35e40 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74  art==2 && buf[st
35e50 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
35e60 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27  uf[start+1] != '
35e70 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  .') ){.        b
35e80 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20  uf[i]='\0';.    
35e90 20 20 20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28      if( osMkdir(
35ea0 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  buf, SQLITE_DEFA
35eb0 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
35ec0 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20  MISSIONS) ){.   
35ed0 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65         int err=e
35ee0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
35ef0 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20  if( err!=EEXIST 
35f00 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
35f10 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
35f20 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44  LOCKPATH  FAILED
35f30 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a   creating %s, ".
35f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f50 20 20 20 20 20 22 27 25 73 27 20 70 72 6f 78 79       "'%s' proxy
35f60 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
35f70 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
35f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
35f90 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29  f, strerror(err)
35fa0 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f 73 47 65  , lockPath, osGe
35fb0 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20 20 20  tpid(0)));.     
35fc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72         return er
35fd0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
35fe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35ff0 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31  .      start=i+1
36000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b  ;.    }.    buf[
36010 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d  i] = lockPath[i]
36020 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
36030 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
36040 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
36050 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  h=%s pid=%d\n", 
36060 6c 6f 63 6b 50 61 74 68 2c 20 6f 73 47 65 74 70  lockPath, osGetp
36070 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72  id(0)));.  retur
36080 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
36090 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66  eate a new VFS f
360a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
360b0 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
360c0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
360d0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
360e0 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66  ) and open the f
360f0 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22  ile named "path"
36100 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
36110 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  criptor..**.** T
36120 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
36130 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c  ponsible not onl
36140 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68  y for closing th
36150 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
36160 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f  r.** but also fo
36170 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65  r freeing the me
36180 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
36190 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65  with the file de
361a0 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61  scriptor..*/.sta
361b0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
361c0 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20  ateUnixFile(.   
361d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
361e0 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74  h,        /* pat
361f0 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e  h for the new un
36200 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e  ixFile */.    un
36210 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c  ixFile **ppFile,
36220 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69         /* unixFi
36230 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72  le created and r
36240 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a  eturned by ref *
36250 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b  /.    int islock
36260 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f  file           /
36270 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69  * if non zero mi
36280 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20  ssing dirs will 
36290 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20  be created */.) 
362a0 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  {.  int fd = -1;
362b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
362c0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
362d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f  LITE_OK;.  int o
362e0 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
362f0 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73  R | O_CREAT;.  s
36300 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79  qlite3_vfs dummy
36310 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e  Vfs;.  int terrn
36320 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  o = 0;.  UnixUnu
36330 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
36340 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20   NULL;..  /* 1. 
36350 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65  first try to ope
36360 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
36370 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61  e.  ** 2. if tha
36380 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69  t fails, and thi
36390 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65  s is a lock file
363a0 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72   (not-conch), tr
363b0 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  y creating.  ** 
363c0 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
363d0 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20  tories and then 
363e0 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20  try again..  ** 
363f0 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  3. if that fails
36400 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  , try to open th
36410 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79  e file read-only
36420 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  .  ** otherwise 
36430 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20  return BUSY (if 
36440 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41  lock file) or CA
36450 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63  NTOPEN for the c
36460 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  onch file.  */. 
36470 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
36480 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20  eusableFd(path, 
36490 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
364a0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
364b0 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
364c0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
364d0 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
364e0 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
364f0 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
36500 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
36510 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36520 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
36530 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
36540 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
36550 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
36560 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
36570 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
36580 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
36590 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
365a0 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
365b0 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
365c0 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
365d0 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
365e0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
365f0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
36600 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
36610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36620 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
36630 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20  {.    openFlags 
36640 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
36650 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
36660 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
36670 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
36680 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
36690 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
366a0 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29  if( islockfile )
366b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
366c0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
366d0 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65  }.    switch (te
366e0 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61  rrno) {.      ca
366f0 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20  se EACCES:.     
36700 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36710 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73  _PERM;.      cas
36720 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20  e EIO: .        
36730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
36740 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65  ERR_LOCK; /* eve
36750 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74  n though it is t
36760 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20  he conch */.    
36770 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
36780 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36790 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
367a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70      }.  }.  .  p
367b0 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
367c0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
367d0 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b  (sizeof(*pNew));
367e0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c  .  if( pNew==NUL
367f0 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  L ){.    rc = SQ
36800 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
36810 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f  goto end_create_
36820 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d  proxy;.  }.  mem
36830 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
36840 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
36850 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67    pNew->openFlag
36860 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
36870 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66   memset(&dummyVf
36880 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  s, 0, sizeof(dum
36890 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79  myVfs));.  dummy
368a0 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28  Vfs.pAppData = (
368b0 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
368c0 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79  oFinder;.  dummy
368d0 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d  Vfs.zName = "dum
368e0 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e  my";.  pUnused->
368f0 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73  fd = fd;.  pUnus
36900 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e  ed->flags = open
36910 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70  Flags;.  pNew->p
36920 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
36930 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  ;.  .  rc = fill
36940 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d  InUnixFile(&dumm
36950 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74  yVfs, fd, (sqlit
36960 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70  e3_file*)pNew, p
36970 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ath, 0);.  if( r
36980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36990 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e      *ppFile = pN
369a0 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ew;.    return S
369b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e  QLITE_OK;.  }.en
369c0 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20  d_create_proxy: 
369d0 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f     .  robust_clo
369e0 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c  se(pNew, fd, __L
369f0 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65  INE__);.  sqlite
36a00 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
36a10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e  sqlite3_free(pUn
36a20 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  used);.  return 
36a30 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
36a40 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d  LITE_TEST./* sim
36a50 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
36a60 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
36a70 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
36a80 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74  ile paths */.int
36a90 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
36aa0 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  num = 0;.#endif.
36ab0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
36ac0 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20  OSTIDLEN    16  
36ad0 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f  /* conch file ho
36ae0 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a  st id length */.
36af0 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 45 54  .#ifdef HAVE_GET
36b00 48 4f 53 54 55 55 49 44 0a 2f 2a 20 4e 6f 74 20  HOSTUUID./* Not 
36b10 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69  always defined i
36b20 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73  n the headers as
36b30 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
36b40 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65  */.extern int ge
36b50 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74  thostuuid(uuid_t
36b60 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63   id, const struc
36b70 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74  t timespec *wait
36b80 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 67 65  );.#endif../* ge
36b90 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69  t the host ID vi
36ba0 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c  a gethostuuid(),
36bb0 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f   pHostID must po
36bc0 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53  int to PROXY_HOS
36bd0 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73  TIDLEN .** bytes
36be0 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d   of writable mem
36bf0 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
36c00 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49  nt proxyGetHostI
36c10 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  D(unsigned char 
36c20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70  *pHostID, int *p
36c30 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  Error){.  assert
36c40 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  (PROXY_HOSTIDLEN
36c50 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f   == sizeof(uuid_
36c60 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48  t));.  memset(pH
36c70 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f  ostID, 0, PROXY_
36c80 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 64  HOSTIDLEN);.#ifd
36c90 65 66 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55  ef HAVE_GETHOSTU
36ca0 55 49 44 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  UID.  {.    stru
36cb0 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
36cc0 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
36cd0 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
36ce0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73  /.    if( gethos
36cf0 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
36d00 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
36d10 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
36d20 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72  o;.      if( pEr
36d30 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ror ){.        *
36d40 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
36d50 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
36d60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
36d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
36d80 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36d90 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e  TER(pError);.#en
36da0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
36db0 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
36dc0 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
36dd0 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
36de0 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
36df0 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
36e00 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
36e10 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
36e20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
36e30 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
36e40 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
36e50 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
36e60 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
36e70 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
36e80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
36e90 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
36ea0 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
36eb0 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
36ec0 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
36ed0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
36ee0 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
36ef0 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
36f00 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
36f10 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
36f20 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
36f30 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
36f40 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
36f50 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
36f60 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
36f70 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
36f80 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
36f90 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
36fa0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
36fb0 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
36fc0 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
36fd0 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
36fe0 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
36ff0 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
37000 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
37010 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
37020 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
37030 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
37040 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
37050 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
37060 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
37070 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
37080 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
37090 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
370a0 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
370b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
370c0 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
370d0 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
370e0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
370f0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
37100 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
37110 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
37120 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
37130 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
37140 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
37150 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
37160 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
37170 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
37180 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
37190 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
371a0 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
371b0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
371c0 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
371d0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
371e0 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
371f0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
37200 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
37210 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
37220 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
37230 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
37240 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
37250 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
37260 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
37270 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
37280 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
37290 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
372a0 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
372b0 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
372c0 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
372d0 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
372e0 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
372f0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
37300 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
37310 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
37320 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
37330 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
37340 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
37350 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
37360 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37370 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
37380 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
37390 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
373a0 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
373b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
373c0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
373d0 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
373e0 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
373f0 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
37400 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
37410 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
37420 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
37430 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
37440 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
37450 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
37460 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
37470 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
37480 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
37490 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
374a0 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
374b0 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
374c0 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
374d0 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
374e0 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
374f0 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
37500 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
37510 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69  O_EXCL), 0);.  i
37520 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73  f( fd<0 ){.    s
37530 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
37540 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
37550 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20  errmsg, "create 
37560 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
37570 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
37580 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
37590 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65  }.  if( osPwrite
375a0 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65  (fd, buf, readLe
375b0 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f  n, 0) != (ssize_
375c0 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20  t)readLen ){.   
375d0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
375e0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
375f0 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65  , errmsg, "write
37600 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
37610 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
37620 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
37630 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28   }.  if( rename(
37640 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b  tPath, cPath) ){
37650 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
37660 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
37670 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72  msg), errmsg, "r
37680 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64  ename failed (%d
37690 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
376a0 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
376b0 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ck;.  }.  rc = 0
376c0 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
376d0 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65  rr, "broke stale
376e0 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20   lock on %s\n", 
376f0 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74  cPath);.  robust
37700 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f  _close(pFile, co
37710 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  nchFile->h, __LI
37720 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69  NE__);.  conchFi
37730 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f  le->h = fd;.  co
37740 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
37750 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
37760 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61  CREAT;..end_brea
37770 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20  klock:.  if( rc 
37780 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  ){.    if( fd>=0
37790 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
377a0 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
377b0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
377c0 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
377d0 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
377e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
377f0 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
37800 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
37810 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
37820 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
37830 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
37840 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
37850 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
37860 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
37870 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
37880 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
37890 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
378a0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
378b0 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
378c0 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
378d0 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
378e0 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
378f0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37900 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
37910 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
37920 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
37930 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
37940 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
37950 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
37960 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37970 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
37980 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
37990 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
379a0 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d  odTime;.  .  mem
379b0 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d  set(&conchModTim
379c0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e  e, 0, sizeof(con
379d0 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64  chModTime));.  d
379e0 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  o {.    rc = con
379f0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
37a00 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
37a10 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
37a20 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
37a30 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69  nTries ++;.    i
37a40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
37a50 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  SY ){.      /* I
37a60 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65  f the lock faile
37a70 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20  d (busy):.      
37a80 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20   * 1st try: get 
37a90 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20  the mod time of 
37aa0 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20  the conch, wait 
37ab0 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61  0.5s and try aga
37ac0 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e  in. .       * 2n
37ad0 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74  d try: fail if t
37ae0 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e  he mod time chan
37af0 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69  ged or host id i
37b00 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69  s different, wai
37b10 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20  t .       *     
37b20 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64        10 sec and
37b30 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20   try again.     
37b40 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65    * 3rd try: bre
37b50 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65  ak the lock unle
37b60 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  ss the mod time 
37b70 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20  has changed..   
37b80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
37b90 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
37ba0 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
37bb0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62  conchFile->h, &b
37bc0 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  uf) ){.        s
37bd0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
37be0 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
37bf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
37c00 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
37c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
37c20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
37c30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
37c40 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
37c50 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
37c60 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
37c70 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
37c80 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
37c90 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
37ca0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
37cb0 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
37cc0 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
37cd0 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >1 );.      if( 
37ce0 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
37cf0 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
37d00 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c  imespec.tv_sec |
37d10 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63  | .         conc
37d20 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63  hModTime.tv_nsec
37d30 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
37d40 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a  spec.tv_nsec ){.
37d50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
37d60 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
37d70 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
37d80 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29   if( nTries==2 )
37d90 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72  {  .        char
37da0 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43   tBuf[PROXY_MAXC
37db0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
37dc0 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72    int len = osPr
37dd0 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
37de0 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  , tBuf, PROXY_MA
37df0 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
37e00 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30         if( len<0
37e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
37e20 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
37e30 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
37e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37e50 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
37e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37e70 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f    if( len>PROXY_
37e80 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75  PATHINDEX && tBu
37e90 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58  f[0]==(char)PROX
37ea0 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b  Y_CONCHVERSION){
37eb0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
37ec0 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
37ed0 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ck if the host i
37ee0 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  d doesn't match 
37ef0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
37f00 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66   0!=memcmp(&tBuf
37f10 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
37f20 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
37f30 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b  XY_HOSTIDLEN) ){
37f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
37f50 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
37f60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37f70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37f80 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
37f90 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  reak the lock on
37fa0 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61   short read or a
37fb0 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63   version mismatc
37fc0 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  h */.          r
37fd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
37fe0 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
37ff0 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30       usleep(1000
38000 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31  0000); /* wait 1
38010 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  0 sec and try th
38020 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a  e lock again */.
38030 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
38040 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
38050 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20   .      assert( 
38060 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20  nTries==3 );.   
38070 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42     if( 0==proxyB
38080 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  reakConchLock(pF
38090 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29  ile, myHostID) )
380a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
380b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
380c0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
380d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
380e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
380f0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
38100 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
38110 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
38120 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
38130 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
38140 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
38150 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
38160 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
38170 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
38180 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
38190 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
381a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
381b0 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28      }.  } while(
381c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
381d0 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a   && nTries<3 );.
381e0 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
381f0 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20  }../* Takes the 
38200 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20  conch by taking 
38210 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
38220 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  d read the conte
38230 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a  nts conch, if .*
38240 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f  * lockPath is no
38250 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74  n-NULL, the host
38260 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   ID and lock fil
38270 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63  e path must matc
38280 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c  h.  A NULL .** l
38290 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68  ockPath means th
382a0 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20  at the lockPath 
382b0 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
382c0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69  e will be used i
382d0 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49  f the .** host I
382e0 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e  Ds match, or a n
382f0 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  ew lock path wil
38300 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61  l be generated a
38310 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
38320 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20   and written to 
38330 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a  the conch file..
38340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
38350 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69  oxyTakeConch(uni
38360 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
38370 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
38380 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
38390 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
383a0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
383b0 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20  ngContext; .  . 
383c0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
383d0 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72  Held!=0 ){.    r
383e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
383f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
38400 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
38410 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
38420 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20  ile;.    uuid_t 
38430 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e  myHostID;.    in
38440 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  t pError = 0;.  
38450 20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50    char readBuf[P
38460 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
38470 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b  ];.    char lock
38480 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
38490 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70  ;.    char *temp
384a0 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b  LockPath = NULL;
384b0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
384c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74  LITE_OK;.    int
384d0 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30   createConch = 0
384e0 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64  ;.    int hostId
384f0 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69  Match = 0;.    i
38500 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a  nt readLen = 0;.
38510 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f      int tryOldLo
38520 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
38530 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b  int forceNewLock
38540 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20  Path = 0;.    . 
38550 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b     OSTRACE(("TAK
38560 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25  ECONCH  %d for %
38570 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e  s pid=%d\n", con
38580 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
38590 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
385a0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
385b0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
385c0 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 0a  th : ":auto:"),.
385d0 20 20 20 20 20 20 20 20 20 20 20 20 20