/ Hex Artifact Content
Login

Artifact 641b7da6960b5bfa2120a97464578da436f4876c:


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 42 4c 4f 43 4b 20 20 20 20 20 30 78 30 31  E_BLOCK     0x01
2510: 30 30 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53  00     /* Next S
2520: 48 4d 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 6c  HM lock might bl
2530: 6f 63 6b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ock */../*.** In
2540: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
2550: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
2560: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
2570: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
2580: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
2590: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
25a0: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
25b0: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
25c0: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
25d0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
25e0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
25f0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2600: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
2610: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
2620: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2630: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2640: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2650: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
2660: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
2670: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2680: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
2690: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
26a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
26b0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
26c0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
26d0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
26e0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
26f0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2700: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2710: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2720: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2730: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2740: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2750: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2760: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45  ndif../*.** HAVE
2770: 5f 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74 73  _MREMAP defaults
2780: 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75   to true on Linu
2790: 78 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65 72  x and false ever
27a0: 79 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a  ywhere else..*/.
27b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56  #if !defined(HAV
27c0: 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20 64  E_MREMAP).# if d
27d0: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
27e0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47 4e  ) && defined(_GN
27f0: 55 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65 66  U_SOURCE).#  def
2800: 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  ine HAVE_MREMAP 
2810: 31 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69  1.# else.#  defi
2820: 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 30  ne HAVE_MREMAP 0
2830: 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
2840: 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63 69 74 6c  ./*.** Explicitl
2850: 79 20 63 61 6c 6c 20 74 68 65 20 36 34 2d 62 69  y call the 64-bi
2860: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c 73 65  t version of lse
2870: 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f 69 64 2e  ek() on Android.
2880: 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 73 65 65   Otherwise, lsee
2890: 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65 20 33 32  k().** is the 32
28a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c 20 65 76  -bit version, ev
28b0: 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f 46 46 53  en if _FILE_OFFS
28c0: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
28d0: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  fined..*/.#ifdef
28e0: 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 23 20 64   __ANDROID__.# d
28f0: 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c 73 65 65  efine lseek lsee
2900: 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  k64.#endif../*.*
2910: 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78  * Different Unix
2920: 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65   systems declare
2930: 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65   open() in diffe
2940: 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65  rent ways.  Same
2950: 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e   use.** open(con
2960: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64  st char*,int,mod
2970: 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73  e_t).  Others us
2980: 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e open(const cha
2990: 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20  r*,int,...)..** 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
29b0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e  s important when
29c0: 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72   using a pointer
29d0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
29e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65  ..**.** The safe
29f0: 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77  st way to deal w
2a00: 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ith the problem 
2a10: 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65  is to always use
2a20: 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a   this wrapper.**
2a30: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 61   which always ha
2a40: 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d  s the same well-
2a50: 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63  defined interfac
2a60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a70: 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74   posixOpen(const
2a80: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
2a90: 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64  t flags, int mod
2aa0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  e){.  return ope
2ab0: 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  n(zFile, flags, 
2ac0: 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  mode);.}../* For
2ad0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
2ae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
2af0: 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
2b00: 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73   char*, int*);.s
2b10: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
2b20: 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b  tpagesize(void);
2b30: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2b40: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2b50: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2b60: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2b70: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2b80: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2b90: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2ba0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2bb0: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2bc0: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
2bd0: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
2be0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2bf0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2c00: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2c10: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2c20: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2c30: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2c40: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
2c50: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
2c60: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2c80: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2c90: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2ca0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
2cb0: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
2cc0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
2cd0: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2ce0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2cf0: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2d00: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2d10: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2d20: 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20  {.  { "open",   
2d30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2d40: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
2d50: 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65  Open,  0  },.#de
2d60: 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20  fine osOpen     
2d70: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2d80: 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61  char*,int,int))a
2d90: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2da0: 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65  ent)..  { "close
2db0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
2dc0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63  e3_syscall_ptr)c
2dd0: 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  lose,      0  },
2de0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
2df0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
2e00: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  t))aSyscall[1].p
2e10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61  Current)..  { "a
2e20: 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73  ccess",       (s
2e30: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2e40: 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30  tr)access,     0
2e50: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41    },.#define osA
2e60: 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a  ccess    ((int(*
2e70: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
2e80: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  t))aSyscall[2].p
2e90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67  Current)..  { "g
2ea0: 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73  etcwd",       (s
2eb0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2ec0: 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30  tr)getcwd,     0
2ed0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47    },.#define osG
2ee0: 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a  etcwd    ((char*
2ef0: 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74  (*)(char*,size_t
2f00: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
2f10: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74  urrent)..  { "st
2f20: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
2f30: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2f40: 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20  r)stat,       0 
2f50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74   },.#define osSt
2f60: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
2f70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
2f80: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
2f90: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29  all[4].pCurrent)
2fa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50  ../*.** The DJGP
2fb0: 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72  P compiler envir
2fc0: 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73  onment looks mos
2fd0: 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62  tly like Unix, b
2fe0: 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74  ut it.** lacks t
2ff0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
3000: 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65  m call.  So rede
3010: 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20  fine fcntl() to 
3020: 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  be something.** 
3030: 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63  that always succ
3040: 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e  eeds.  This mean
3050: 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64  s that locking d
3060: 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
3070: 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42  der.** DJGPP.  B
3080: 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77  ut it is DOS - w
3090: 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65  hat did you expe
30a0: 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ct?.*/.#ifdef __
30b0: 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74  DJGPP__.  { "fst
30c0: 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20  at",        0,  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
30e0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
30f0: 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30  stat(a,b,c)    0
3100: 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20  .#else     .  { 
3110: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3120: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3130: 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20  _ptr)fstat,     
3140: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3150: 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74  sFstat     ((int
3160: 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73  (*)(int,struct s
3170: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35  tat*))aSyscall[5
3180: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
3190: 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61  if..  { "ftrunca
31a0: 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  te",    (sqlite3
31b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72  _syscall_ptr)ftr
31c0: 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23  uncate,  0  },.#
31d0: 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61  define osFtrunca
31e0: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
31f0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3200: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3210: 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20  { "fcntl",      
3220: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3230: 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20  ll_ptr)fcntl,   
3240: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3250: 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69   osFcntl     ((i
3260: 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e  nt(*)(int,int,..
3270: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  .))aSyscall[7].p
3280: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3290: 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73  ead",         (s
32a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
32b0: 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30  tr)read,       0
32c0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52    },.#define osR
32d0: 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65  ead      ((ssize
32e0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
32f0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3300: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
3310: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
3320: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
3330: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
3340: 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22  TYLE.  { "pread"
3350: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3360: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3370: 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ead,      0  },.
3380: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3390: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
33a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
33b0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
33c0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
33d0: 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73  osPread     ((ss
33e0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
33f0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3400: 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75  )aSyscall[9].pCu
3410: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3420: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
3430: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
3440: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3450: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36  scall_ptr)pread6
3460: 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  4,    0  },.#els
3470: 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  e.  { "pread64",
3480: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3490: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
34a0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
34b0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
34c0: 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f  ead64   ((ssize_
34d0: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
34e0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
34f0: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
3500: 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22  nt)..  { "write"
3510: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3520: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72  3_syscall_ptr)wr
3530: 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ite,      0  },.
3540: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20  #define osWrite 
3550: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3560: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3570: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
3580: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
3590: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
35a0: 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54  _PREAD) || SQLIT
35b0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
35c0: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69  _STYLE.  { "pwri
35d0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
35e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35f0: 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d  pwrite,     0  }
3600: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
3610: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
3620: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3630: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3640: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3650: 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28  e osPwrite    ((
3660: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3670: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3680: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
36a0: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
36b0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
36c0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
36d0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
36e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
36f0: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36  call_ptr)pwrite6
3700: 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  4,   0  },.#else
3710: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
3720: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3730: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3740: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3750: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3760: 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74  ite64  ((ssize_t
3770: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3780: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3790: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
37a0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
37b0: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
37c0: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
37d0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
37e0: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c  call_ptr)fchmod,
37f0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3800: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64  #define osFchmod
3810: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3820: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
3830: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[14].pCurrent).
3840: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
3850: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
3860: 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
3870: 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22  _FALLOCATE.  { "
3880: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3890: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
38a0: 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ptr)posix_falloc
38b0: 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ate,  0 },.#else
38c0: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
38d0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
38e0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3900: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3910: 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e  osFallocate ((in
3920: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f  t(*)(int,off_t,o
3930: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
3940: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
3950: 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20  { "unlink",     
3960: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3970: 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20  ll_ptr)unlink,  
3980: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3990: 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20  efine osUnlink  
39a0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
39b0: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
39c0: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
39d0: 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f    { "openDirecto
39e0: 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  ry",    (sqlite3
39f0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65  _syscall_ptr)ope
3a00: 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20  nDirectory,     
3a10: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3a20: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28  OpenDirectory ((
3a30: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3a40: 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c  r*,int*))aSyscal
3a50: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
3a60: 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20  .  { "mkdir",   
3a70: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3a80: 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c  scall_ptr)mkdir,
3a90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20  #define osMkdir 
3ab0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
3ac0: 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29  st char*,mode_t)
3ad0: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
3ae0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d  urrent)..  { "rm
3af0: 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71  dir",        (sq
3b00: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3b10: 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20  r)rmdir,        
3b20: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3b30: 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e  osRmdir     ((in
3b40: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3b50: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
3b60: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
3b70: 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73  chown",       (s
3b80: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3b90: 74 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20  tr)fchown,      
3ba0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3bb0: 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69   osFchown    ((i
3bc0: 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c  nt(*)(int,uid_t,
3bd0: 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  gid_t))aSyscall[
3be0: 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  20].pCurrent).. 
3bf0: 20 7b 20 22 67 65 74 65 75 69 64 22 2c 20 20 20   { "geteuid",   
3c00: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3c10: 61 6c 6c 5f 70 74 72 29 67 65 74 65 75 69 64 2c  all_ptr)geteuid,
3c20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3c30: 65 66 69 6e 65 20 6f 73 47 65 74 65 75 69 64 20  efine osGeteuid 
3c40: 20 20 28 28 75 69 64 5f 74 28 2a 29 28 76 6f 69    ((uid_t(*)(voi
3c50: 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  d))aSyscall[21].
3c60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3c70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3c80: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
3c90: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
3ca0: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
3cb0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3cc0: 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20  scall_ptr)mmap, 
3cd0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3ce0: 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28   osMmap ((void*(
3cf0: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
3d00: 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f  int,int,int,off_
3d10: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e  t))aSyscall[22].
3d20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3d30: 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28  munmap",       (
3d40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3d50: 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20  ptr)munmap,     
3d60: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3d70: 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69  e osMunmap ((voi
3d80: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3d90: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d  _t))aSyscall[23]
3da0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3db0: 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20  HAVE_MREMAP.  { 
3dc0: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
3dd0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3de0: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
3df0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3e00: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
3e10: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3e20: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3e30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3e40: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3e50: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
3e60: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
3e70: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
3e80: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
3e90: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74  rrent)..  { "get
3ea0: 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c  pagesize",  (sql
3eb0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ec0: 29 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65  )unixGetpagesize
3ed0: 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f  , 0 },.#define o
3ee0: 73 47 65 74 70 61 67 65 73 69 7a 65 20 28 28 69  sGetpagesize ((i
3ef0: 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79 73  nt(*)(void))aSys
3f00: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
3f10: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e  t)..  { "readlin
3f20: 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  k",     (sqlite3
3f30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
3f40: 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30 20  dlink,        0 
3f50: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  },.#define osRea
3f60: 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28  dlink ((ssize_t(
3f70: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  *)(const char*,c
3f80: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
3f90: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
3fa0: 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20  nt)..#endif..}; 
3fb0: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3fc0: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3fd0: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a 2f 2a 0a  m calls */.../*.
3fe0: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  ** On some syste
3ff0: 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68  ms, calls to fch
4000: 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67  own() will trigg
4010: 65 72 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  er a message in 
4020: 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f  a security.** lo
4030: 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66  g if they come f
4040: 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f  rom non-root pro
4050: 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69  cesses.  So avoi
4060: 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e  d calling fchown
4070: 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20  () if.** we are 
4080: 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  not running as r
4090: 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oot..*/.static i
40a0: 6e 74 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28  nt robustFchown(
40b0: 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75 69  int fd, uid_t ui
40c0: 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a 23  d, gid_t gid){.#
40d0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
40e0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
40f0: 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65 75    return osGeteu
4100: 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63 68  id() ? 0 : osFch
4110: 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b  own(fd,uid,gid);
4120: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
4130: 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65   This is the xSe
4140: 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65  tSystemCall() me
4150: 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f  thod of sqlite3_
4160: 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  vfs for all of t
4170: 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53  he.** "unix" VFS
4180: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4190: 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65  TE_OK opon succe
41a0: 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67  ssfully updating
41b0: 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63   the.** system c
41c0: 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20  all pointer, or 
41d0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
41e0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
41f0: 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73  onfigurable.** s
4200: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64  ystem call named
4210: 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   zName..*/.stati
4220: 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73  c int unixSetSys
4230: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
4240: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
4250: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
4260: 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f  VFS pointer.  No
4270: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
4280: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
42a0: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
42b0: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
42c0: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
42d0: 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20  l_ptr pNewFunc  
42e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
42f0: 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61  w system call va
4300: 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  lue */.){.  unsi
4310: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e  gned int i;.  in
4320: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
4330: 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45  TFOUND;..  UNUSE
4340: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
4350: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Used);.  if( zNa
4360: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
4370: 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67  If no zName is g
4380: 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c  iven, restore al
4390: 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74  l system calls t
43a0: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a  o their default.
43b0: 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20      ** settings 
43c0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a  and return NULL.
43d0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
43e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66  SQLITE_OK;.    f
43f0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4400: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4410: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4420: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4430: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4440: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
4450: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4460: 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  rent = aSyscall[
4470: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
4480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
4490: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  se{.    /* If zN
44a0: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
44b0: 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c  , operate on onl
44c0: 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d  y the one system
44d0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65   call.    ** spe
44e0: 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
44f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
4500: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
4510: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
4520: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
4530: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
4540: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4550: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
4560: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
4570: 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29  i].pDefault==0 )
4580: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73  {.          aSys
4590: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
45a0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
45b0: 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  Current;.       
45c0: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
45d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
45e0: 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d     if( pNewFunc=
45f0: 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20  =0 ) pNewFunc = 
4600: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4610: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53  ault;.        aS
4620: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4630: 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20  nt = pNewFunc;. 
4640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4660: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4670: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4680: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74   value of a syst
4690: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
46a0: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69   NULL if zName i
46b0: 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67  s not a.** recog
46c0: 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c  nized system cal
46d0: 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73  l name.  NULL is
46e0: 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
46f0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
4700: 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  l.** is currentl
4710: 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  y undefined..*/.
4720: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
4730: 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47  yscall_ptr unixG
4740: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
4750: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
4760: 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63  tUsed,.  const c
4770: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
4780: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
4790: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
47a0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
47b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
47c0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
47d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
47e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
47f0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
4800: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
4810: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  ==0 ) return aSy
4820: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4830: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
4840: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
4850: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
4860: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
4870: 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65  call after zName
4880: 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c  .  If zName==NUL
4890: 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  L.** then return
48a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
48b0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
48c0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
48d0: 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20   if zName.** is 
48e0: 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20  the last system 
48f0: 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65  call or if zName
4900: 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
4910: 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73   of a valid.** s
4920: 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  ystem call..*/.s
4930: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
4940: 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d   *unixNextSystem
4950: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
4960: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4970: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
4980: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
4990: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
49a0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
49b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
49c0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
49d0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
49e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
49f0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4a00: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
4a10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
4a20: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
4a30: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
4a40: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
4a50: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
4a60: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
4a70: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
4a80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4a90: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ../*.** Do not a
4aa0: 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64  ccept any file d
4ab0: 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74  escriptor less t
4ac0: 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20  han this value, 
4ad0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
4ae0: 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74  d.** opening dat
4af0: 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67  abase file using
4b00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4b10: 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
4b20: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a  nly used for .**
4b30: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c   standard input,
4b40: 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72   output, and err
4b50: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  or..*/.#ifndef S
4b60: 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49  QLITE_MINIMUM_FI
4b70: 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20  LE_DESCRIPTOR.# 
4b80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49  define SQLITE_MI
4b90: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
4ba0: 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a  IPTOR 3.#endif..
4bb0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65  /*.** Invoke ope
4bc0: 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74  n().  Do so mult
4bd0: 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69  iple times, unti
4be0: 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63  l it either succ
4bf0: 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73  eeds or.** fails
4c00: 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e   for some reason
4c10: 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54   other than EINT
4c20: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
4c30: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
4c40: 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e  de "m" is 0 then
4c50: 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64   set it to the d
4c60: 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51  efault for.** SQ
4c70: 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75  Lite.  The defau
4c80: 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46  lt is SQLITE_DEF
4c90: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
4ca0: 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a  SIONS (normally.
4cb0: 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69  ** 0644) as modi
4cc0: 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74  fied by the syst
4cd0: 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20  em umask.  If m 
4ce0: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a  is not 0, then.*
4cf0: 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
4d00: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65  creation mode be
4d10: 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72   exactly m ignor
4d20: 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a  ing the umask..*
4d30: 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d  *.** The m param
4d40: 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e  eter will be non
4d50: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20  -zero only when 
4d60: 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d  creating -wal, -
4d70: 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20  journal,.** and 
4d80: 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20  -shm files.  We 
4d90: 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73  want those files
4da0: 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c   to have *exactl
4db0: 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70  y* the same.** p
4dc0: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
4dd0: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
4de0: 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72  abase, unadulter
4df0: 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  ated by the umas
4e00: 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61  k..** In that wa
4e10: 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65  y, if a database
4e20: 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d   file is -rw-rw-
4e30: 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c  rw or -rw-rw-r-,
4e40: 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61   and a.** transa
4e50: 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e  ction crashes an
4e60: 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20  d leaves behind 
4e70: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  hot journals, th
4e80: 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73  en any.** proces
4e90: 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74  s that is able t
4ea0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
4eb0: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73  atabase will als
4ec0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  o be able to.** 
4ed0: 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20  recover the hot 
4ee0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61  journals..*/.sta
4ef0: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
4f00: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
4f10: 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74  z, int f, mode_t
4f20: 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20   m){.  int fd;. 
4f30: 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f   mode_t m2 = m ?
4f40: 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41   m : SQLITE_DEFA
4f50: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
4f60: 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29  IONS;.  while(1)
4f70: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f  {.#if defined(O_
4f80: 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20  CLOEXEC).    fd 
4f90: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43  = osOpen(z,f|O_C
4fa0: 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73  LOEXEC,m2);.#els
4fb0: 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  e.    fd = osOpe
4fc0: 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69  n(z,f,m2);.#endi
4fd0: 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  f.    if( fd<0 )
4fe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
4ff0: 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69  o==EINTR ) conti
5000: 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nue;.      break
5010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5020: 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  fd>=SQLITE_MINIM
5030: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
5040: 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OR ) break;.    
5050: 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20  osClose(fd);.   
5060: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
5070: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20  ITE_WARNING, .  
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61                "a
5090: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c  ttempt to open \
50a0: 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65  "%s\" as file de
50b0: 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c  scriptor %d", z,
50c0: 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d   fd);.    fd = -
50d0: 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65  1;.    if( osOpe
50e0: 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66  n("/dev/null", f
50f0: 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , m)<0 ) break;.
5100: 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20    }.  if( fd>=0 
5110: 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20  ){.    if( m!=0 
5120: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
5130: 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20  stat statbuf;.  
5140: 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
5150: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30  fd, &statbuf)==0
5160: 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74   .       && stat
5170: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20  buf.st_size==0. 
5180: 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75        && (statbu
5190: 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21  f.st_mode&0777)!
51a0: 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =m .      ){.   
51b0: 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64       osFchmod(fd
51c0: 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , m);.      }.  
51d0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
51e0: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
51f0: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
5200: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
5210: 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c  ==0).    osFcntl
5220: 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
5230: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
5240: 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
5250: 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  EC);.#endif.  }.
5260: 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a    return fd;.}..
5270: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
5280: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
5290: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
52a0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
52b0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
52c0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
52d0: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
52e0: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
52f0: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
5300: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
5310: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
5320: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
5330: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
5340: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
5350: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
5360: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
5370: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
5380: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
5390: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
53a0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
53b0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
53c0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
53d0: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
53e0: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
53f0: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
5400: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
5410: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
5420: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
5430: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
5440: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
5450: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
5460: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
5470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
5480: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
5490: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
54a0: 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b  X_STATIC_VFS1));
54b0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
54c0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
54d0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
54e0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
54f0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
5500: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
5510: 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64 65  _VFS1));.}.#ifde
5520: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
5530: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
5540: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
5550: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5560: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
5570: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
5580: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5590: 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64  C_VFS1));.}.#end
55a0: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
55b0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
55c0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
55d0: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
55e0: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
55f0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
5600: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
5610: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
5620: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
5630: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
5640: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
5650: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
5660: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
5670: 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c  st char *azFileL
5680: 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63  ock(int eFileLoc
5690: 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46  k){.  switch( eF
56a0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  ileLock ){.    c
56b0: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
56c0: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
56d0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
56e0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
56f0: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
5700: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
5710: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
5720: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
5730: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
5740: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
5750: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
5760: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
5770: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
5780: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
5790: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
57a0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
57b0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
57c0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
57d0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
57e0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
57f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5800: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
5810: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
5820: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
5830: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
5840: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
5850: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
5860: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
5870: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
5880: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
5890: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
58a0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
58b0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
58d0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
58e0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
58f0: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
5900: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
5910: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
5920: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
5930: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
5940: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
5950: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
5960: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
5970: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
5980: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
5990: 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28      s = osFcntl(
59a0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
59b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
59c0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
59d0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
59e0: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
59f0: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
5a00: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
5a10: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
5a20: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
5a30: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
5a40: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
5a50: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
5a60: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
5a70: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
5a80: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5a90: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
5aa0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5ab0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
5ac0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
5ad0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
5ae0: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
5af0: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
5b00: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
5b10: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5b20: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
5b30: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
5b40: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
5b50: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
5b60: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
5b70: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
5b80: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
5b90: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
5ba0: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
5bb0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
5bc0: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
5bd0: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
5be0: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
5bf0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
5c00: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
5c10: 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
5c20: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
5c30: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
5c40: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
5c50: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
5c60: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
5c70: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
5c80: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
5c90: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
5ca0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
5cb0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
5cc0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
5cd0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
5ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
5cf0: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
5d00: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5d10: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
5d20: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
5d30: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
5d40: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
5d50: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
5d60: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
5d70: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
5d80: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
5d90: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
5da0: 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c  }.#undef osFcntl
5db0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c  .#define osFcntl
5dc0: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
5dd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
5de0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
5df0: 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65   Retry ftruncate
5e00: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
5e10: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
5e20: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20  **.** All calls 
5e30: 74 6f 20 66 74 72 75 6e 63 61 74 65 28 29 20 77  to ftruncate() w
5e40: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ithin this file 
5e50: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74  should be made t
5e60: 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77  hrough.** this w
5e70: 72 61 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20  rapper.  On the 
5e80: 41 6e 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d  Android platform
5e90: 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
5ea0: 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63  logic below.** c
5eb0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63  ould lead to a c
5ec0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
5ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5ee0: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
5ef0: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
5f00: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
5f10: 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  rc;.#ifdef __AND
5f20: 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41  ROID__.  /* On A
5f30: 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74  ndroid, ftruncat
5f40: 65 28 29 20 61 6c 77 61 79 73 20 75 73 65 73 20  e() always uses 
5f50: 33 32 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20  32-bit offsets, 
5f60: 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46  even if .  ** _F
5f70: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d  ILE_OFFSET_BITS=
5f80: 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  64 is defined. T
5f90: 68 69 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20  his means it is 
5fa0: 75 6e 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70  unsafe to attemp
5fb0: 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61  t to.  ** trunca
5fc0: 74 65 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79  te a file to any
5fd0: 20 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61   size larger tha
5fe0: 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79  n 2GiB. Silently
5ff0: 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   ignore any.  **
6000: 20 73 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20   such attempts. 
6010: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71   */.  if( sz>(sq
6020: 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46  lite3_int64)0x7F
6030: 46 46 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63  FFFFFF ){.    rc
6040: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6050: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64  }else.#endif.  d
6060: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
6070: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
6080: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
6090: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
60a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
60b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
60c0: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
60d0: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
60e0: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
60f0: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
6100: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
6110: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
6120: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
6130: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
6140: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
6150: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
6160: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
6170: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
6180: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
6190: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
61a0: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
61b0: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
61c0: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
61d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
61e0: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
61f0: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
6200: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
6210: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6220: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
6230: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
6240: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
6250: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
6260: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
6270: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
6280: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
6290: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
62a0: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
62b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 28 73 71 6c  {.  assert( (sql
62c0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
62d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
62e0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73 71  | .          (sq
62f0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
6300: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
6310: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
6320: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6330: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
6340: 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  OCK) ||.        
6350: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
6360: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
6370: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
6380: 29 20 29 3b 0a 20 20 73 77 69 74 63 68 20 28 70  ) );.  switch (p
6390: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63  osixError) {.  c
63a0: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 63  ase EACCES: .  c
63b0: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
63c0: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
63d0: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
63e0: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
63f0: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
6400: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
6410: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
6420: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
6430: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
6440: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
6450: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
6460: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
6470: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
6480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6490: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
64a0: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
64b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
64c0: 3b 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  ;.    .  default
64d0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
64e0: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
64f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6540: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
6550: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
6560: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
6570: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
6580: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
6590: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
65a0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
65b0: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
65c0: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
65d0: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
65e0: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
65f0: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
6600: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
6610: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
6620: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
6630: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
6640: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
6650: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
6660: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
6670: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
6680: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
6690: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
66a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
66b0: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
66c0: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
66d0: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
66e0: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
66f0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
6700: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
6710: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
6720: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
6730: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
6740: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
6750: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
6760: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
6770: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
6780: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
6790: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
67a0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
67b0: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
67c0: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
67d0: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
67e0: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
67f0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
6800: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
6810: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
6820: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
6830: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
6840: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
6850: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
6860: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6870: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
6880: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
6890: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
68a0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
68b0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
68e0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
68f0: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
6900: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
6910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
6920: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
6930: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
6940: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
6950: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
6960: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
6970: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
6980: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
6990: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
69a0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
69b0: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
69c0: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
69d0: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
69e0: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
69f0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6a00: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
6a10: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
6a20: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
6a30: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
6a40: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
6a50: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
6a60: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
6a70: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
6a80: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
6a90: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
6aa0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
6ab0: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
6ac0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
6ad0: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
6ae0: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
6af0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
6b00: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
6b10: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
6b20: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
6b30: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
6b40: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
6b50: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
6b60: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
6b70: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
6b80: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
6b90: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
6ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
6bb0: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
6bc0: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
6bd0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
6be0: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
6bf0: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
6c00: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
6c10: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
6c20: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
6c30: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
6c40: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
6c50: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
6c60: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
6c70: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
6c80: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
6c90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
6ca0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6cb0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
6cc0: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
6cd0: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
6ce0: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
6cf0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
6d00: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
6d10: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
6d20: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
6d30: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
6d40: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
6d50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6d60: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
6d70: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
6d80: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
6d90: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
6da0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
6db0: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
6dc0: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
6dd0: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
6de0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6df0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
6e00: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
6e10: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
6e20: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
6e30: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
6e40: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
6e50: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
6e60: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
6e70: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
6e80: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
6e90: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
6ea0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
6eb0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
6ec0: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
6ed0: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
6ee0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
6ef0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6f00: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6f10: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6f20: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
6f30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
6f40: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
6f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
6f60: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
6f70: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6f80: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
6f90: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
6fa0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
6fb0: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
6fc0: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
6fd0: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
6fe0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
6ff0: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
7000: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7020: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
7030: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
7040: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
7050: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
7060: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
7070: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
7080: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
7090: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
70a0: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
70b0: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b  eof(*pNew) + (n+
70c0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  1) );.  if( pNew
70d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
70e0: 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63    pNew->zCanonic
70f0: 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  alName = (char*)
7100: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63  &pNew[1];.  memc
7110: 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  py(pNew->zCanoni
7120: 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75  calName, zAbsolu
7130: 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20  teName, n+1);.  
7140: 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  n = vxworksSimpl
7150: 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43  ifyName(pNew->zC
7160: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
7170: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
7180: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  or an existing e
7190: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69  ntry that matchi
71a0: 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  ng the canonical
71b0: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66   name..  ** If f
71c0: 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20  ound, increment 
71d0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
71e0: 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  unt and return a
71f0: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a   pointer to.  **
7200: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69   the existing fi
7210: 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e  le ID..  */.  un
7220: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7230: 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65    for(pCandidate
7240: 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  =vxworksFileList
7250: 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43  ; pCandidate; pC
7260: 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64  andidate=pCandid
7270: 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ate->pNext){.   
7280: 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d   if( pCandidate-
7290: 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20  >nName==n .     
72a0: 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69  && memcmp(pCandi
72b0: 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  date->zCanonical
72c0: 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e  Name, pNew->zCan
72d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d  onicalName, n)==
72e0: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  0.    ){.       
72f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
7300: 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64  w);.       pCand
7310: 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  idate->nRef++;. 
7320: 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
7330: 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72  utex();.       r
7340: 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65  eturn pCandidate
7350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7360: 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66  * No match was f
7370: 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d  ound.  We will m
7380: 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49  ake a new file I
7390: 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65  D */.  pNew->nRe
73a0: 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e  f = 1;.  pNew->n
73b0: 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77  Name = n;.  pNew
73c0: 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b  ->pNext = vxwork
73d0: 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77  sFileList;.  vxw
73e0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70  orksFileList = p
73f0: 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  New;.  unixLeave
7400: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
7410: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7420: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
7430: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
7440: 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  n a vxworksFileI
7450: 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a  d object.  Free.
7460: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68  ** the object wh
7470: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
7480: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
7490: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ero..*/.static v
74a0: 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  oid vxworksRelea
74b0: 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20  seFileId(struct 
74c0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
74d0: 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72  Id){.  unixEnter
74e0: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
74f0: 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29  t( pId->nRef>0 )
7500: 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pId->nRef--;
7510: 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66  .  if( pId->nRef
7520: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
7530: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7540: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
7550: 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  =&vxworksFileLis
7560: 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  t; *pp && *pp!=p
7570: 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29  Id; pp = &((*pp)
7580: 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20  ->pNext)){}.    
7590: 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64  assert( *pp==pId
75a0: 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49   );.    *pp = pI
75b0: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  d->pNext;.    sq
75c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b  lite3_free(pId);
75d0: 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
75e0: 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69  Mutex();.}.#endi
75f0: 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
7600: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
7610: 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75  *** End of Uniqu
7620: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
7630: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
7640: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
7650: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
7660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76a0: 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
76b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76f0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
7700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7710: 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20   Posix Advisory 
7720: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  ****.**.** POSIX
7750: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
7760: 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65  are broken by de
7770: 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20  sign.  ANSI STD 
7780: 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a  1003.1 (1996).**
7790: 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32   section 6.5.2.2
77a0: 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75   lines 483 throu
77b0: 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74  gh 490 specify t
77c0: 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65  hat when a proce
77d0: 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c  ss.** sets or cl
77e0: 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61  ears a lock, tha
77f0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72  t operation over
7800: 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20  rides any prior 
7810: 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20  locks set.** by 
7820: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7830: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65  .  It does not e
7840: 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f  xplicitly say so
7850: 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69  , but this impli
7860: 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76  es.** that it ov
7870: 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65  errides locks se
7880: 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  t by the same pr
7890: 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69  ocess using a di
78a0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
78b0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e  descriptor.  Con
78c0: 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20  sider this test 
78d0: 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  case:.**.**     
78e0: 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e    int fd1 = open
78f0: 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44  ("./file1", O_RD
7900: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
7910: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  );.**       int 
7920: 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd2 = open("./fi
7930: 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le2", O_RDWR|O_C
7940: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a  REAT, 0644);.**.
7950: 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c  ** Suppose ./fil
7960: 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61  e1 and ./file2 a
7970: 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61  re really the sa
7980: 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  me file (because
7990: 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72  .** one is a har
79a0: 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69  d or symbolic li
79b0: 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29  nk to the other)
79c0: 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74   then if you set
79d0: 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65  .** an exclusive
79e0: 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68   lock on fd1, th
79f0: 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e  en try to get an
7a00: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
7a10: 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f  ** on fd2, it wo
7a20: 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61  rks.  I would ha
7a30: 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20  ve expected the 
7a40: 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a  second lock to.*
7a50: 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65  * fail since the
7a60: 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61  re was already a
7a70: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
7a80: 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a  e due to fd1..**
7a90: 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69   But not so.  Si
7aa0: 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63  nce both locks c
7ab0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ame from the sam
7ac0: 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a  e process, the.*
7ad0: 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64  * second overrid
7ae0: 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76  es the first, ev
7af0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
7b00: 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ere on different
7b10: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
7b20: 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64  tors opened on d
7b30: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61  ifferent file na
7b40: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  mes..**.** This 
7b50: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61  means that we ca
7b60: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
7b70: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
7b80: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a  ize file access.
7b90: 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69  ** among competi
7ba0: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
7bb0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
7bc0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
7bd0: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
7be0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
7bf0: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
7c00: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
7c10: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
7c20: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
7c30: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
7c40: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
7c50: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
7c60: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
7c70: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
7c80: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
7c90: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
7ca0: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
7cb0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
7cc0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
7cd0: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
7ce0: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
7cf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
7d00: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
7d10: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
7d20: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
7d30: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
7d40: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
7d50: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
7d60: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
7d70: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
7d80: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
7d90: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
7da0: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
7db0: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
7dc0: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
7dd0: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
7de0: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
7df0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
7e00: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
7e10: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
7e20: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
7e30: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
7e40: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
7e50: 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65   (Aside: The use
7e60: 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72   of inode number
7e70: 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20  s as unique IDs 
7e80: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
7e90: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72   VxWorks..** For
7ea0: 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76   VxWorks, we hav
7eb0: 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74  e to use the alt
7ec0: 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20  ernative unique 
7ed0: 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20  ID system based 
7ee0: 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20  on.** canonical 
7ef0: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70  filename and imp
7f00: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20  lemented in the 
7f10: 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f  previous divisio
7f20: 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  n.).**.** The sq
7f30: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
7f40: 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69  ture for POSIX i
7f50: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74  s no longer just
7f60: 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65   an integer file
7f70: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20  .** descriptor. 
7f80: 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72   It is now a str
7f90: 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64  ucture that hold
7fa0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69  s the integer fi
7fb0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
7fc0: 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
7fd0: 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  o a structure th
7fe0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
7ff0: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63   internal.** loc
8000: 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  ks on the corres
8010: 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20  ponding inode.  
8020: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63  There is one loc
8030: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  king structure.*
8040: 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20  * per inode, so 
8050: 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  if the same inod
8060: 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63  e is opened twic
8070: 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65  e, both unixFile
8080: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70   structures.** p
8090: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
80a0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
80b0: 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  re.  The locking
80c0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
80d0: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
80e0: 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c  count (so we wil
80f0: 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64  l know when to d
8100: 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20  elete it) and a 
8110: 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74  "cnt".** field t
8120: 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73  hat tells us its
8130: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
8140: 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d  tatus.  cnt==0 m
8150: 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65  eans the.** file
8160: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63   is unlocked.  c
8170: 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65  nt==-1 means the
8180: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63   file has an exc
8190: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20  lusive lock..** 
81a0: 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72  cnt>0 means ther
81b0: 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64  e are cnt shared
81c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69   locks on the fi
81d0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74  le..**.** Any at
81e0: 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72  tempt to lock or
81f0: 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66   unlock a file f
8200: 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20  irst checks the 
8210: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63  locking.** struc
8220: 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c  ture.  The fcntl
8230: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69  () system call i
8240: 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74  s only invoked t
8250: 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49  o set a .** POSI
8260: 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e  X lock if the in
8270: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75  ternal lock stru
8280: 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e  cture transition
8290: 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c  s between.** a l
82a0: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c  ocked and an unl
82b0: 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  ocked state..**.
82c0: 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68  ** But wait:  th
82d0: 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65  ere are yet more
82e0: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50   problems with P
82f0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
8300: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f  cks..**.** If yo
8310: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  u close a file d
8320: 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70  escriptor that p
8330: 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20  oints to a file 
8340: 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a  that has locks,.
8350: 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20  ** all locks on 
8360: 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
8370: 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  re owned by the 
8380: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
8390: 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e  are.** released.
83a0: 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
83b0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65   this problem, e
83c0: 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ach unixInodeInf
83d0: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e  o object.** main
83e0: 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66  tains a count of
83f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
8400: 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ending locks on 
8410: 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68  tha inode..** Wh
8420: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
8430: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
8440: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
8450: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
8460: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
8470: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
8480: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
8490: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
84a0: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
84b0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
84c0: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
84d0: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
84e0: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
84f0: 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * The unixInodeI
8500: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65  nfo structure ke
8510: 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69  eps a list of fi
8520: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
8530: 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62  hat need to.** b
8540: 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61  e closed and tha
8550: 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64  t list is walked
8560: 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77   (and cleared) w
8570: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
8580: 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a  k.** clears..**.
8590: 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70  ** Yet another p
85a0: 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68  roblem:  LinuxTh
85b0: 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61  reads do not pla
85c0: 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69  y well with posi
85d0: 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d  x locks..**.** M
85e0: 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  any older versio
85f0: 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20  ns of linux use 
8600: 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73  the LinuxThreads
8610: 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69   library which i
8620: 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63  s.** not posix c
8630: 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72  ompliant.  Under
8640: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61   LinuxThreads, a
8650: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
8660: 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e   thread.** A can
8670: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  not be modified 
8680: 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  or overridden by
8690: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
86a0: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74  ead B..** Only t
86b0: 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69  hread A can modi
86c0: 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f  fy the lock.  Lo
86d0: 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69  cking behavior i
86e0: 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20  s correct.** if 
86f0: 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75  the appliation u
8700: 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61  ses the newer Na
8710: 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61  tive Posix Threa
8720: 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29  d Library (NPTL)
8730: 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77  .** on linux - w
8740: 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20  ith NPTL a lock 
8750: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8760: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
8770: 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72   locks.** in thr
8780: 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72  ead B.  But ther
8790: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
87a0: 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  now at compile-t
87b0: 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72  ime which.** thr
87c0: 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69  eading library i
87d0: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53  s being used.  S
87e0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  o there is no wa
87f0: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20  y to know at.** 
8800: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
8810: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
8820: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
8830: 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61  e locks on threa
8840: 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20  d B..** One has 
8850: 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65  to do a run-time
8860: 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76   check to discov
8870: 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  er the behavior 
8880: 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
8890: 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
88a0: 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20   SQLite used to 
88b0: 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72  support LinuxThr
88c0: 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f  eads.  But suppo
88d0: 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65  rt for LinuxThre
88e0: 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70  ads.** was dropp
88f0: 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ed beginning wit
8900: 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e  h version 3.7.0.
8910: 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74    SQLite will st
8920: 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a  ill work with.**
8930: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72   LinuxThreads pr
8940: 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20  ovided that (1) 
8950: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65  there is no more
8960: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63   than one connec
8970: 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74  tion .** per dat
8980: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
8990: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61  e same process a
89a0: 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20  nd (2) database 
89b0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64  connections.** d
89c0: 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73  o not move acros
89d0: 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f  s threads..*/../
89e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
89f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8a00: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
8a10: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
8a20: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
8a30: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
8a40: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
8a50: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
8a60: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
8a70: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
8a80: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
8a90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
8aa0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
8ab0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
8ac0: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
8ad0: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
8ae0: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
8af0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b10: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
8b20: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8b30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8b40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8b50: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
8b60: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
8b70: 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  open.** inode.  
8b80: 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65  Or, on LinuxThre
8b90: 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e  ads, there is on
8ba0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  e of these struc
8bb0: 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63  tures for.** eac
8bc0: 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62  h inode opened b
8bd0: 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a  y each thread..*
8be0: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
8bf0: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
8c00: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
8c10: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
8c20: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
8c30: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
8c40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
8c50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
8c60: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a  object and this.
8c70: 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20  ** object keeps 
8c80: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
8c90: 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c  umber of unixFil
8ca0: 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74  e pointing to it
8cb0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
8cc0: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
8cd0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
8ce0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
8cf0: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
8d00: 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64  */.  int nShared
8d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8d20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8d30: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
8d40: 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  eld */.  unsigne
8d50: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
8d60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
8d70: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
8d80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
8d90: 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  c. */.  unsigned
8da0: 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f   char bProcessLo
8db0: 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ck;     /* An ex
8dc0: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
8dd0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
8de0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
8e10: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
8e20: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
8e30: 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
8e40: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
8e50: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
8e60: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8e70: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
8e80: 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20  int nLock;      
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
8eb0: 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f  standing file lo
8ec0: 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  cks */.  UnixUnu
8ed0: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
8ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
8ef0: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
8f00: 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  ors to close */.
8f10: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
8f20: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
8f30: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
8f40: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
8f50: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78  bjects */.  unix
8f60: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76  InodeInfo *pPrev
8f70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  ;           /*  
8f80: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
8f90: 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49  nked */.#if SQLI
8fa0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8fb0: 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e  G_STYLE.  unsign
8fc0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
8fd0: 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72  redByte;  /* for
8fe0: 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73   AFP simulated s
8ff0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65  hared lock */.#e
9000: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ndif.#if OS_VXWO
9010: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
9020: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9030: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
9040: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
9050: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
9060: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
9070: 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ];  /* Name of t
9080: 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  hat semaphore */
9090: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
90a0: 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c  * A lists of all
90b0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
90c0: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
90d0: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
90e0: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  *inodeList = 0;.
90f0: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
9100: 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f  unction - unixLo
9110: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20  gErrorAtLine(), 
9120: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
9130: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
9140: 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f  o.** unixLogErro
9150: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  r()..**.** It is
9160: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
9170: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
9180: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
9190: 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62   and errno has b
91a0: 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c  een.** set. It l
91b0: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
91c0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
91d0: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
91e0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
91f0: 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20  f.** errno and, 
9200: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
9210: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
9220: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
9230: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a  strerror() or.**
9240: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a   strerror_r()..*
9250: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
9260: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
9270: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
9280: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
9290: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
92a0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
92b0: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
92c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
92d0: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
92e0: 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f  EN). .** The two
92f0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
9300: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
9310: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
9320: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
9330: 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e  .** failed (e.g.
9340: 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e   "unlink", "open
9350: 22 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ") and the assoc
9360: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
9370: 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e  m path,.** if an
9380: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e  y..*/.#define un
9390: 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63  ixLogError(a,b,c
93a0: 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  )     unixLogErr
93b0: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f  orAtLine(a,b,c,_
93c0: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
93d0: 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  int unixLogError
93e0: 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72  AtLine(.  int er
93f0: 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  rcode,          
9400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
9410: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
9420: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9430: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
9440: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
9450: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
9460: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
9470: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
9480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9490: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
94a0: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
94b0: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
94e0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
94f0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
9500: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
9510: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9520: 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67         /* Messag
9530: 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  e from strerror(
9540: 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ) or equivalent 
9550: 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20  */.  int iErrno 
9560: 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  = errno;        
9570: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79       /* Saved sy
9580: 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62  scall error numb
9590: 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  er */..  /* If t
95a0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72  his is not a thr
95b0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53  eadsafe build (S
95c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
95d0: 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20  ==0), then use. 
95e0: 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72   ** the strerror
95f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f  () function to o
9600: 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d  btain the human-
9610: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d  readable error m
9620: 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69  essage.  ** equi
9630: 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e  valent to errno.
9640: 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
9650: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20  strerror_r()..  
9660: 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  */ .#if SQLITE_T
9670: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
9680: 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52  ined(HAVE_STRERR
9690: 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72  OR_R).  char aEr
96a0: 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  r[80];.  memset(
96b0: 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aErr, 0, sizeof(
96c0: 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d  aErr));.  zErr =
96d0: 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20   aErr;..  /* If 
96e0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
96f0: 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f  P (set by autoco
9700: 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f  nf scripts) or _
9710: 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69  _USE_GNU is defi
9720: 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ned,.  ** assume
9730: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
9740: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e   provides the GN
9750: 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72  U version of str
9760: 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20  error_r() that. 
9770: 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
9780: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
9790: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
97a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
97b0: 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20  That pointer .  
97c0: 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ** may point to 
97d0: 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61  aErr[], or it ma
97e0: 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  y point to some 
97f0: 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73  static storage s
9800: 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20  omewhere. .  ** 
9810: 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  Otherwise, assum
9820: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
9830: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50  m provides the P
9840: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20  OSIX version of 
9850: 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  .  ** strerror_r
9860: 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73  (), which always
9870: 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72   writes an error
9880: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45   message into aE
9890: 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rr[]..  **.  ** 
98a0: 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f  If the code inco
98b0: 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20  rrectly assumes 
98c0: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50  that it is the P
98d0: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61  OSIX version tha
98e0: 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61  t is.  ** availa
98f0: 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d  ble, the error m
9900: 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65  essage will ofte
9910: 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  n be an empty st
9920: 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a  ring. Not a.  **
9930: 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49   huge problem. I
9940: 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c  ncorrectly concl
9950: 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47  uding that the G
9960: 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  NU version is av
9970: 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  ailable .  ** co
9980: 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65  uld lead to a se
9990: 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20  gfault though.. 
99a0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
99b0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
99c0: 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  P) || defined(__
99d0: 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20  USE_GNU).  zErr 
99e0: 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72  = .# endif.  str
99f0: 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20  error_r(iErrno, 
9a00: 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72  aErr, sizeof(aEr
9a10: 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51  r)-1);..#elif SQ
9a20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
9a30: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
9a40: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
9a50: 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28   but strerror_r(
9a60: 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  ) is not availab
9a70: 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  le. */.  zErr = 
9a80: 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  "";.#else.  /* N
9a90: 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75  on-threadsafe bu
9aa0: 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ild, use strerro
9ab0: 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  r(). */.  zErr =
9ac0: 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f   strerror(iErrno
9ad0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
9ae0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
9af0: 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65  h = "";.  sqlite
9b00: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
9b10: 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a       "os_unix.c:
9b20: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
9b30: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
9b40: 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e  ne, iErrno, zFun
9b50: 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20  c, zPath, zErr. 
9b60: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
9b70: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
9b80: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  Close a file des
9b90: 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  criptor..**.** W
9ba0: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c  e assume that cl
9bb0: 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77  ose() almost alw
9bc0: 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65  ays works, since
9bd0: 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61   it is only in a
9be0: 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70  .** very sick ap
9bf0: 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20  plication or on 
9c00: 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74  a very sick plat
9c10: 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67  form that it mig
9c20: 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69  ht fail..** If i
9c30: 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d  t does fail, sim
9c40: 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ply leak the fil
9c50: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75  e descriptor, bu
9c60: 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20  t do log the.** 
9c70: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  error..**.** Not
9c80: 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  e that it is not
9c90: 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63   safe to retry c
9ca0: 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e  lose() after EIN
9cb0: 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  TR since the.** 
9cc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9cd0: 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61  might have alrea
9ce0: 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62  dy been reused b
9cf0: 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  y another thread
9d00: 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74  ..** So we don't
9d10: 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63   even try to rec
9d20: 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e  over from an EIN
9d30: 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68  TR.  Just log th
9d40: 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d  e error.** and m
9d50: 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ove on..*/.stati
9d60: 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c  c void robust_cl
9d70: 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ose(unixFile *pF
9d80: 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20  ile, int h, int 
9d90: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f  lineno){.  if( o
9da0: 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20  sClose(h) ){.   
9db0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9dc0: 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ine(SQLITE_IOERR
9dd0: 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
9de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9df0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20          pFile ? 
9e00: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30  pFile->zPath : 0
9e10: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d  , lineno);.  }.}
9e20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
9e30: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
9e40: 2e 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20  .  Do this in a 
9e50: 73 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68  subroutine as th
9e60: 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61  at provides.** a
9e70: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
9e80: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
9e90: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
9ea0: 20 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45   void storeLastE
9eb0: 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70  rrno(unixFile *p
9ec0: 46 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29  File, int error)
9ed0: 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  {.  pFile->lastE
9ee0: 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a  rrno = error;.}.
9ef0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
9f00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9f10: 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20  s accumuated in 
9f20: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9f30: 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  o->pUnused list.
9f40: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
9f50: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
9f60: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9f70: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9f80: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9f90: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9fa0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20  ixUnusedFd *p;. 
9fb0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
9fc0: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49  Next;.  for(p=pI
9fd0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
9fe0: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
9ff0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
a000: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
a010: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
a020: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
a030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
a040: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
a050: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
a060: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
a070: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
a080: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
a090: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
a0a0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
a0b0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
a0c0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
a0d0: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
a0e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
a0f0: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
a100: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a110: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
a120: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a130: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
a140: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
a150: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a160: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
a170: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
a180: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
a190: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
a1a0: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
a1b0: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
a1c0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
a1d0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
a1e0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a1f0: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
a200: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
a210: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
a220: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
a230: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
a240: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a250: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
a260: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
a270: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
a280: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
a290: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
a2a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a2b0: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
a2c0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
a2d0: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
a2e0: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
a2f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
a300: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
a310: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a320: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
a330: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
a340: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
a350: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
a360: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
a370: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a380: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
a390: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a3a0: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
a3b0: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
a3c0: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
a3d0: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
a3e0: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
a3f0: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
a400: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
a410: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
a420: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
a430: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
a440: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
a450: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
a460: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
a470: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a480: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a490: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a4a0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a4b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a4c0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
a4d0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
a4e0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
a4f0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
a500: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
a510: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
a520: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
a530: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
a540: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
a550: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
a560: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
a570: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
a580: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
a590: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a5a0: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
a5b0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
a5e0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
a5f0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
a620: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
a630: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
a640: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
a650: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
a660: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
a670: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
a680: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
a690: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
a6a0: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
a6b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
a6c0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a6d0: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
a6e0: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
a6f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a700: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
a710: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
a720: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
a730: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
a740: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
a750: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
a760: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
a770: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
a780: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
a790: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
a7a0: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
a7b0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
a7c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a7d0: 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
a7e0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
a7f0: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 45  );.#if defined(E
a800: 4f 56 45 52 46 4c 4f 57 29 20 26 26 20 64 65 66  OVERFLOW) && def
a810: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 53 41  ined(SQLITE_DISA
a820: 42 4c 45 5f 4c 46 53 29 0a 20 20 20 20 69 66 28  BLE_LFS).    if(
a830: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a840: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
a850: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
a860: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
a870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
a880: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
a890: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
a8a0: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
a8b0: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
a8c0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
a8d0: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
a8e0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
a8f0: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
a900: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
a910: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
a920: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
a930: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
a940: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
a950: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
a960: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
a970: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
a980: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
a990: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
a9a0: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
a9b0: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
a9c0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
a9d0: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
a9e0: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
a9f0: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
aa00: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
aa10: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
aa20: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
aa30: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
aa40: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
aa50: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
aa60: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
aa70: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
aa80: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
aa90: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
aaa0: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
aab0: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
aac0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
aad0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
aae0: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
aaf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
ab00: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
ab10: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
ab20: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
ab30: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
ab40: 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20  ){.    do{ rc = 
ab50: 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c  osWrite(fd, "S",
ab60: 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c   1); }while( rc<
ab70: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
ab80: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  R );.    if( rc!
ab90: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =1 ){.      stor
aba0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
abb0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
abc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
abd0: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ERR;.    }.    r
abe0: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
abf0: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
ac00: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
ac10: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
ac20: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
ac30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ac40: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
ac50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d  .  }.#endif..  m
ac60: 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30  emset(&fileId, 0
ac70: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
ac80: 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20  );.  fileId.dev 
ac90: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
aca0: 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
acb0: 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20  .  fileId.pId = 
acc0: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
acd0: 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d  e.  fileId.ino =
ace0: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
acf0: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65  .#endif.  pInode
ad00: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
ad10: 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
ad20: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
ad30: 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   &pInode->fileId
ad40: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
ad50: 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  ) ){.    pInode 
ad60: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
ad70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64  .  }.  if( pInod
ad80: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f  e==0 ){.    pIno
ad90: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
ada0: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
adb0: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
adc0: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
add0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ade0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
adf0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
ae00: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
ae10: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
ae20: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
ae30: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
ae40: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
ae50: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d    pInode->nRef =
ae60: 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   1;.    pInode->
ae70: 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73  pNext = inodeLis
ae80: 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  t;.    pInode->p
ae90: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
aea0: 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e  ( inodeList ) in
aeb0: 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  odeList->pPrev =
aec0: 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f   pInode;.    ino
aed0: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b  deList = pInode;
aee0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
aef0: 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  node->nRef++;.  
af00: 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70  }.  *ppInode = p
af10: 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  Inode;.  return 
af20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
af30: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
af40: 69 66 20 70 46 69 6c 65 20 68 61 73 20 62 65 65  if pFile has bee
af50: 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c  n renamed or unl
af60: 69 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77  inked since it w
af70: 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
af80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
af90: 69 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78  ileHasMoved(unix
afa0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69  File *pFile){.#i
afb0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72  f OS_VXWORKS.  r
afc0: 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e  eturn pFile->pIn
afd0: 6f 64 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d  ode!=0 && pFile-
afe0: 3e 70 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  >pId!=pFile->pIn
aff0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b  ode->fileId.pId;
b000: 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
b010: 73 74 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75  stat buf;.  retu
b020: 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  rn pFile->pInode
b030: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73  !=0 &&.      (os
b040: 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74  Stat(pFile->zPat
b050: 68 2c 20 26 62 75 66 29 21 3d 30 20 7c 7c 20 62  h, &buf)!=0 || b
b060: 75 66 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65  uf.st_ino!=pFile
b070: 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  ->pInode->fileId
b080: 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  .ino);.#endif.}.
b090: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20  ../*.** Check a 
b0a0: 75 6e 69 78 46 69 6c 65 20 74 68 61 74 20 69 73  unixFile that is
b0b0: 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 56 65   a database.  Ve
b0c0: 72 69 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  rify the followi
b0d0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68  ng:.**.** (1) Th
b0e0: 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
b0f0: 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20  ne hard link on 
b100: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20  the file.** (2) 
b110: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
b120: 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a  a symbolic link.
b130: 2a 2a 20 28 33 29 20 54 68 65 20 66 69 6c 65 20  ** (3) The file 
b140: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e  has not been ren
b150: 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64  amed or unlinked
b160: 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c  .**.** Issue sql
b170: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b180: 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73  WARNING,...) mes
b190: 73 61 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e  sages if anythin
b1a0: 67 20 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a  g is not right..
b1b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
b1c0: 65 72 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78  erifyDbFile(unix
b1d0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
b1e0: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
b1f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
b200: 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  = osFstat(pFile-
b210: 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28  >h, &buf);.  if(
b220: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71   rc!=0 ){.    sq
b230: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b240: 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f  _WARNING, "canno
b250: 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20  t fstat db file 
b260: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
b270: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  h);.    return;.
b280: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
b290: 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70 46  _nlink==0 && (pF
b2a0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
b2b0: 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
b2c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
b2d0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b2e0: 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e  ARNING, "file un
b2f0: 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65  linked while ope
b300: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
b310: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
b320: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66  n;.  }.  if( buf
b330: 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20  .st_nlink>1 ){. 
b340: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
b350: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
b360: 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74  multiple links t
b370: 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69  o file: %s", pFi
b380: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
b390: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
b3a0: 28 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70  ( fileHasMoved(p
b3b0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  File) ){.    sql
b3c0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b3d0: 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72  WARNING, "file r
b3e0: 65 6e 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65  enamed while ope
b3f0: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
b400: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
b410: 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n;.  }.}.../*.**
b420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
b430: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
b440: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
b450: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
b460: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
b470: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
b480: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
b490: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
b4a0: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
b4b0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
b4c0: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
b4d0: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
b4e0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
b4f0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
b500: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
b510: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
b520: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
b530: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
b540: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
b550: 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73  int unixCheckRes
b560: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
b570: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
b580: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
b590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b5a0: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
b5b0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
b5c0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
b5d0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
b5e0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
b5f0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
b600: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
b610: 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  K; );..  assert(
b620: 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
b630: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
b640: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
b650: 4b 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  K );.  unixEnter
b660: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
b670: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
b680: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
b690: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
b6a0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
b6b0: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
b6c0: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
b6d0: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
b6e0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
b6f0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
b700: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
b710: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  erved = 1;.  }..
b720: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
b730: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
b740: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
b750: 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
b760: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20  __DJGPP__.  if( 
b770: 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46  !reserved && !pF
b780: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
b790: 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20  ocessLock ){.   
b7a0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
b7b0: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
b7c0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b7d0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b7e0: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
b7f0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
b800: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
b810: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
b820: 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e  K;.    if( osFcn
b830: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
b840: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  ETLK, &lock) ){.
b850: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b860: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b870: 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  ERVEDLOCK;.     
b880: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
b890: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
b8a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
b8b0: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
b8c0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
b8d0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
b8e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
b8f0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
b900: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
b910: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
b920: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
b930: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
b940: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
b950: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
b960: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b970: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
b980: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
b990: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
b9a0: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
b9b0: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
b9c0: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
b9d0: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
b9e0: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
b9f0: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
ba00: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
ba10: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
ba20: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
ba30: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
ba40: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
ba50: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
ba60: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
ba70: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
ba80: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
ba90: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
baa0: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
bab0: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
bac0: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
bad0: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
bae0: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
baf0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
bb00: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
bb10: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
bb20: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
bb30: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
bb40: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
bb50: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
bb60: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
bb70: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
bb80: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
bb90: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
bba0: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
bbb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
bbc0: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
bbd0: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
bbe0: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
bbf0: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
bc00: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
bc10: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
bc20: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
bc30: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
bc40: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
bc50: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
bc60: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
bc70: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
bc80: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
bc90: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
bca0: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
bcb0: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
bcc0: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
bcd0: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
bce0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
bcf0: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
bd00: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
bd10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
bd20: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
bd30: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
bd40: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
bd50: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
bd60: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
bd70: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
bd80: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
bd90: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
bda0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
bdb0: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
bdc0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
bdd0: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
bde0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
bdf0: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
be00: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
be10: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
be20: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
be30: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
be40: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
be50: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
be60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
be70: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
be80: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
be90: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
bea0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
beb0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
bec0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
bed0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
bee0: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
bef0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
bf00: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
bf10: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
bf20: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
bf30: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
bf40: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
bf50: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
bf60: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
bf70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
bf80: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
bf90: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
bfa0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bfb0: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
bfc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bfd0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
bfe0: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
bff0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
c000: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
c010: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
c020: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
c030: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
c040: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
c050: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
c060: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
c070: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
c080: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
c090: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
c0a0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
c0b0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
c0c0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
c0d0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
c0e0: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
c0f0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
c100: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
c110: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
c120: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
c130: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
c140: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
c150: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
c160: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
c170: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
c180: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
c190: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
c1a0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
c1b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
c1c0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
c1d0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
c1e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
c1f0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
c200: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
c210: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
c220: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
c230: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c240: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
c250: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
c260: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
c270: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
c280: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
c290: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
c2a0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
c2b0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
c2c0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
c2d0: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
c2e0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
c2f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
c300: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
c310: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
c320: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
c330: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
c340: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
c350: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c360: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
c370: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
c380: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
c390: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
c3a0: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
c3b0: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
c3c0: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
c3d0: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
c3e0: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
c3f0: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
c400: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
c410: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
c420: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
c430: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
c440: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
c450: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
c460: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
c470: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
c480: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
c490: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
c4a0: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
c4b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
c4c0: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
c4d0: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
c4e0: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
c4f0: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
c500: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
c510: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
c520: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
c530: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
c540: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
c550: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c560: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
c570: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
c580: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
c590: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
c5a0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c5b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
c5c0: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
c5d0: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
c5e0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
c5f0: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
c600: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
c610: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
c620: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
c630: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
c640: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
c650: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
c660: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
c670: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c680: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
c690: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
c6a0: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
c6b0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
c6c0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
c6d0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
c6e0: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
c6f0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
c700: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
c710: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
c720: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
c730: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
c740: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
c750: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
c760: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
c770: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
c780: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
c790: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
c7a0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
c7b0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
c7c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
c7d0: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
c7e0: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
c7f0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
c800: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
c810: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
c820: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
c830: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
c840: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
c850: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
c860: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
c870: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
c880: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
c890: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
c8a0: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
c8b0: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
c8c0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
c8d0: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
c8e0: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
c8f0: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
c900: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
c910: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
c920: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
c930: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
c940: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
c950: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
c960: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
c970: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
c980: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
c990: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
c9a0: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
c9b0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
c9c0: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
c9d0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
c9e0: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
c9f0: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
ca00: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
ca10: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
ca20: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
ca30: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
ca40: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
ca50: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
ca60: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
ca70: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
ca80: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
ca90: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
caa0: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
cab0: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
cac0: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
cad0: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
cae0: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
caf0: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
cb00: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
cb10: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
cb20: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
cb30: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
cb40: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
cb50: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
cb60: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
cb70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
cb80: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
cb90: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
cba0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
cbb0: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
cbc0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
cbd0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
cbe0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
cbf0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
cc00: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
cc10: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
cc20: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
cc30: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
cc40: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
cc50: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
cc60: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
cc70: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
cc80: 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ck(pFile->pInode
cc90: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46  ->eFileLock), pF
cca0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
ccb0: 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65  ared,.      osGe
ccc0: 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
ccd0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
cce0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
ccf0: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
cd00: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
cd10: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
cd20: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
cd30: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
cd40: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
cd50: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
cd60: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
cd70: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
cd80: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
cd90: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
cda0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
cdb0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cdc0: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
cdd0: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
cde0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
ce00: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
ce10: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
ce20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
ce30: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
ce40: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
ce50: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
ce60: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
ce70: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
ce80: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
ce90: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
cea0: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
ceb0: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
cec0: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
ced0: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
cee0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
cef0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
cf00: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
cf10: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
cf20: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
cf30: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
cf40: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
cf50: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
cf60: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cf70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
cf80: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
cf90: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
cfa0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
cfb0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
cfc0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
cfd0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
cfe0: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
cff0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
d000: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
d010: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
d020: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
d030: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
d040: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
d050: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
d060: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
d070: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d080: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
d090: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
d0a0: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
d0b0: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
d0c0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d0d0: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
d0e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
d0f0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
d100: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d110: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
d120: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d130: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
d140: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
d150: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
d160: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d170: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
d180: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
d190: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
d1a0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d1b0: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
d1c0: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
d1d0: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
d1e0: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
d1f0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
d200: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
d210: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
d220: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
d230: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
d240: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d250: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
d260: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d270: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d280: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
d290: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d2a0: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
d2b0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d2c0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d2d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d2e0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d2f0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d300: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d310: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
d320: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
d330: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
d340: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
d350: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
d360: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
d370: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
d380: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
d390: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
d3a0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
d3b0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
d3c0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
d3d0: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
d3e0: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
d3f0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
d400: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
d410: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
d420: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
d430: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
d440: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d450: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
d460: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d470: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
d480: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d490: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
d4a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
d4b0: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
d4c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d4d0: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
d4e0: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
d4f0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
d500: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d510: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d520: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d530: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d540: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d550: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d560: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d570: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d580: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d590: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
d5a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
d5b0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
d5c0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
d5d0: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
d5e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
d5f0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
d600: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
d610: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
d620: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
d630: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
d640: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
d650: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
d660: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
d670: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
d680: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
d690: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d6a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d6b0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
d6c0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d6d0: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
d6e0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
d6f0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
d700: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  _OK );..    /* N
d710: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
d720: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
d730: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d740: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
d750: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
d760: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75  _SIZE;.    if( u
d770: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
d780: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
d790: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d7a0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d7b0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d7c0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d7d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
d7e0: 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K);.    }..    /
d7f0: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
d800: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
d810: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
d820: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
d830: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
d840: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
d850: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
d860: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  NLCK;.    if( un
d870: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
d880: 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d  , &lock) && rc==
d890: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d8a0: 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64     /* This could
d8b0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e   happen with a n
d8c0: 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a  etwork mount */.
d8d0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
d8e0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
d8f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d900: 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20  LOCK; .    }..  
d910: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
d920: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d930: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
d940: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
d950: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
d960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
d970: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
d980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
d990: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
d9a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
d9b0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
d9c0: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
d9d0: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
d9e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
d9f0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
da00: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
da10: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
da20: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
da30: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
da40: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
da50: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
da60: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
da70: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
da80: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
da90: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
daa0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
dab0: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
dac0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
dad0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
dae0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
daf0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
db00: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
db10: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
db20: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
db30: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
db40: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
db50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
db60: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
db70: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
db80: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
db90: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
dba0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
dbb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
dbc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
dbd0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
dbe0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
dbf0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
dc00: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
dc10: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
dc20: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
dc30: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
dc40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
dc50: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dc60: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
dc70: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
dc80: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
dc90: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
dca0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
dcb0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
dcc0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
dcd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
dce0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
dcf0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
dd00: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
dd10: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
dd20: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
dd30: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
dd40: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
dd50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd60: 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53    }.  ..#ifdef S
dd70: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
dd80: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
dd90: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
dda0: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
ddb0: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
ddc0: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
ddd0: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
dde0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
ddf0: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
de00: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
de10: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
de20: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
de30: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
de40: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
de50: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
de60: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
de70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
de80: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
de90: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
dea0: 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
deb0: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
dec0: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
ded0: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
dee0: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
def0: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
df00: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
df10: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
df20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
df30: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
df40: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
df50: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
df60: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
df70: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
df80: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
df90: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
dfa0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
dfb0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
dfc0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
dfd0: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
dfe0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
dff0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
e000: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
e010: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
e020: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
e030: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
e040: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e050: 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
e060: 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
e070: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
e080: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
e090: 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
e0a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e0b0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e0c0: 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20  or used by file 
e0d0: 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20  handle pFile to 
e0e0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
e0f0: 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73  g.** pUnused lis
e100: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
e110: 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75  d setPendingFd(u
e120: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
e130: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
e140: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
e150: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
e160: 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46  UnusedFd *p = pF
e170: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ile->pUnused;.  
e180: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  p->pNext = pInod
e190: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49  e->pUnused;.  pI
e1a0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
e1b0: 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  p;.  pFile->h = 
e1c0: 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e  -1;.  pFile->pUn
e1d0: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
e1e0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
e1f0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
e200: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
e210: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
e220: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
e230: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
e240: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
e250: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
e260: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e270: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
e280: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
e290: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
e2a0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
e2b0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
e2c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e2d0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
e2e0: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
e2f0: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
e300: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
e310: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
e320: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
e330: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
e340: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
e350: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
e360: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
e370: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
e380: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
e390: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
e3a0: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
e3b0: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
e3c0: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
e3d0: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
e3e0: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
e3f0: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
e400: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
e410: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
e420: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
e430: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
e440: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
e450: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
e460: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
e470: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e480: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
e490: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
e4a0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e4b0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e4c0: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
e4d0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
e4e0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
e4f0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
e500: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
e510: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
e520: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
e530: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
e540: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
e550: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
e560: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
e570: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e580: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
e590: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
e5a0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
e5b0: 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74  red,.      osGet
e5c0: 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
e5d0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
e5e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e5f0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
e600: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
e610: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e620: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e630: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e640: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
e650: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
e660: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
e670: 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
e680: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e690: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
e6a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
e6b0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
e6c0: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
e6d0: 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  k );..#ifdef SQL
e6e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
e6f0: 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
e700: 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
e710: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
e720: 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
e730: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
e740: 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
e750: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
e760: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
e770: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
e780: 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
e790: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
e7a0: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
e7b0: 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
e7c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e7d0: 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
e7e0: 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
e7f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
e800: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
e810: 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
e820: 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
e830: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
e840: 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
e850: 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
e860: 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
e870: 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
e880: 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
e890: 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
e8a0: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
e8b0: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
e8c0: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
e8d0: 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
e8e0: 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67  if..    /* downg
e8f0: 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72  rading to a shar
e900: 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69  ed lock on NFS i
e910: 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67  nvolves clearing
e920: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a   the write lock.
e930: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73      ** before es
e940: 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72  tablishing the r
e950: 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f  eadlock - to avo
e960: 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  id a race condit
e970: 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65  ion we downgrade
e980: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
e990: 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f   in 2 blocks, so
e9a0: 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68   that part of th
e9b0: 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20  e range will be 
e9c0: 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20  covered by a .  
e9d0: 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20    ** write lock 
e9e0: 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69  until the rest i
e9f0: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72  s covered by a r
ea00: 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a  ead lock:.    **
ea10: 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20    1:   [WWWWW]. 
ea20: 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e     **  2:   [...
ea30: 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20  .W].    **  3:  
ea40: 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20   [RRRRW].    ** 
ea50: 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20   4:   [RRRR.].  
ea60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69    */.    if( eFi
ea70: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
ea80: 4f 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69  OCK ){.#if !defi
ea90: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
eaa0: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
eab0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
eac0: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
ead0: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
eae0: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
eaf0: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
eb00: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
eb10: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
eb20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
eb30: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
eb40: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
eb50: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
eb60: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
eb80: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
eb90: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
eba0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
ebb0: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
ebc0: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
ebd0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
ebe0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
ebf0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
ec00: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ec10: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
ec20: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ec30: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ec40: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
ec50: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
ec60: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
ec70: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
ec80: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
ec90: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
eca0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
ecb0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
ecc0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
ecd0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
ece0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
ecf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
ed00: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ed10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
ed20: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
ed30: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
ed40: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ed50: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
ed60: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ed70: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ed80: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
ed90: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
eda0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
edb0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
edc0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
edd0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
ede0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
edf0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
ee00: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ee10: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ee20: 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_RDLOCK);.    
ee30: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
ee40: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
ee50: 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65             store
ee60: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
ee70: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
ee80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ee90: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
eea0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eeb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
eec0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
eed0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
eee0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
eef0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
ef00: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
ef10: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
ef20: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
ef30: 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
ef40: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
ef50: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
ef60: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
ef70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
ef80: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
ef90: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
efa0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
efb0: 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
efc0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
efd0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
efe0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
eff0: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
f000: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
f010: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
f020: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
f030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
f040: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
f050: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
f060: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
f070: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f080: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f090: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f0a0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
f0b0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
f0c0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
f0d0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
f0e0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f0f0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f100: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
f110: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
f120: 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65  call to unixFile
f130: 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61  Lock() cannot fa
f140: 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  il because anoth
f150: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
f160: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
f170: 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
f180: 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64  le lock. If it d
f190: 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20  oes, this .     
f1a0: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65       ** indicate
f1b0: 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  s that the other
f1c0: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
f1d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f  following the lo
f1e0: 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  cking.          
f1f0: 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20  ** protocol. If 
f200: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65  this happens, re
f210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f220: 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e  R_RDLOCK. Return
f230: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
f240: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75   SQLITE_BUSY wou
f250: 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75  ld confuse the u
f260: 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70  pper layer (in p
f270: 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65  ractice it cause
f280: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
f290: 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69  an assert to fai
f2a0: 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  l). */ .        
f2b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
f2c0: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
f2d0: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
f2e0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
f2f0: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  o);.          go
f300: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
f310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f320: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e  .    }.    lock.
f330: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f340: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
f350: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f360: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f370: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
f380: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
f390: 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50  = 2L;  assert( P
f3a0: 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52  ENDING_BYTE+1==R
f3b0: 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a  ESERVED_BYTE );.
f3c0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f3d0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f3e0: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  k)==0 ){.      p
f3f0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f400: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
f410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f420: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f430: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
f440: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
f450: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
f460: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f470: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
f480: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f490: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
f4a0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
f4b0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
f4c0: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
f4d0: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
f4e0: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
f4f0: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
f500: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
f510: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
f520: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
f530: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
f540: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
f550: 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
f560: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
f570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
f580: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f590: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
f5a0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f5b0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
f5c0: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
f5d0: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
f5e0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f5f0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
f600: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
f610: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f620: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
f640: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f650: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f660: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
f670: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
f680: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
f690: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f6a0: 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
f6b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
f6c0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
f6d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
f6e0: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
f6f0: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
f700: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
f710: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
f720: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
f730: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
f740: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
f750: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
f760: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
f770: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
f780: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
f790: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
f7a0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
f7b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
f7c0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
f7d0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
f7e0: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
f7f0: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
f800: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
f810: 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63  }.  }..end_unloc
f820: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
f830: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
f840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
f850: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
f860: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
f870: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f880: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
f890: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
f8a0: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
f8b0: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
f8c0: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
f8d0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
f8e0: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
f8f0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
f900: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
f910: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
f920: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
f930: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
f940: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
f950: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
f960: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
f970: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
f980: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
f990: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f9a0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
f9b0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
f9c0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61  _MMAP_SIZE>0.  a
f9d0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
f9e0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
f9f0: 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64   ((unixFile *)id
fa00: 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  )->nFetchOut==0 
fa10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
fa20: 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
fa30: 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29  d, eFileLock, 0)
fa40: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
fa50: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
fa60: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
fa70: 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
fa80: 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
fa90: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  ;.static void un
faa0: 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
fab0: 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64  File *pFd);.#end
fac0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
fad0: 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73  unction performs
fae0: 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68   the parts of th
faf0: 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f  e "close file" o
fb00: 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d  peration .** com
fb10: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
fb20: 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63  ng schemes. It c
fb30: 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74  loses the direct
fb40: 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20  ory and file.** 
fb50: 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79  handles, if they
fb60: 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20   are valid, and 
fb70: 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20  sets all fields 
fb80: 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a  of the unixFile.
fb90: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
fba0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a  0..**.** It is *
fbb0: 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74  not* necessary t
fbc0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
fbd0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
fbe0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  ne is called,.**
fbf0: 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73   even on VxWorks
fc00: 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20  .  A mutex will 
fc10: 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56  be acquired on V
fc20: 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a  xWorks by the.**
fc30: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
fc40: 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e  ileId() routine.
fc50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
fc60: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c  loseUnixFile(sql
fc70: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
fc80: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
fc90: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
fca0: 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  d;.#if SQLITE_MA
fcb0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
fcc0: 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
fcd0: 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ile);.#endif.  i
fce0: 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
fcf0: 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  {.    robust_clo
fd00: 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
fd10: 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
fd20: 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
fd30: 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57  ;.  }.#if OS_VXW
fd40: 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65  ORKS.  if( pFile
fd50: 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28  ->pId ){.    if(
fd60: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
fd70: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
fd80: 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  ETE ){.      osU
fd90: 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
fda0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
fdb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
fdc0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
fdd0: 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
fde0: 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
fdf0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
fe00: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49  fdef SQLITE_UNLI
fe10: 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20  NK_AFTER_CLOSE. 
fe20: 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
fe30: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
fe40: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f  _DELETE ){.    o
fe50: 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a  sUnlink(pFile->z
fe60: 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
fe70: 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a  e3_free(*(char**
fe80: 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  )&pFile->zPath);
fe90: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  .    pFile->zPat
fea0: 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  h = 0;.  }.#endi
feb0: 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  f.  OSTRACE(("CL
fec0: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
fed0: 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65  File->h));.  Ope
fee0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
fef0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
ff00: 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  le->pUnused);.  
ff10: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
ff20: 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
ff30: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
ff40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ff50: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
ff60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
ff70: 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
ff80: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
ff90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ffa0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
ffb0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
ffc0: 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69  id;.  verifyDbFi
ffd0: 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69  le(pFile);.  uni
ffe0: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  xUnlock(id, NO_L
fff0: 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  OCK);.  unixEnte
10000 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
10010 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20  unixFile.pInode 
10020 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
10030 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  here. Otherwise,
10040 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f   a different clo
10050 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  se.  ** routine 
10060 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  (e.g. nolockClos
10070 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61  e()) would be ca
10080 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20  lled instead..  
10090 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
100a0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
100b0 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49  k>0 || pFile->pI
100c0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
100d0 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41  ck==0 );.  if( A
100e0 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e  LWAYS(pFile->pIn
100f0 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70  ode) && pFile->p
10100 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
10110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
10120 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
10130 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
10140 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
10150 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a   file just.    *
10160 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
10170 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
10180 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
10190 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
101a0 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69  le.    ** descri
101b0 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
101c0 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
101d0 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
101e0 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
101f0 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
10200 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
10210 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
10220 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
10230 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ile);.  }.  rele
10240 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
10250 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73  le);.  rc = clos
10260 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
10270 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
10280 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10290 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
102a0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f  ** End of the po
102b0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
102c0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
102d0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
102e0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
102f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10330 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
10340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10380 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103a0 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67  ** No-op Locking
103b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
103c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103d0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65  ***.**.** Of the
103e0 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67   various locking
103f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
10400 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73   available, this
10410 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a   is by far the.*
10420 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63  * simplest:  loc
10430 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  king is ignored.
10440 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20    No attempt is 
10450 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65  made to lock the
10460 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
10470 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  e for reading or
10480 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
10490 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  This locking mod
104a0 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
104b0 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64   for use on read
104c0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a  -only databases.
104d0 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65  ** (ex: database
104e0 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65  s that are burne
104f0 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66  d into CD-ROM, f
10500 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74  or example.)  It
10510 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20   can.** also be 
10520 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c  used if the appl
10530 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20  ication employs 
10540 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65  some external me
10550 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72  chanism to.** pr
10560 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f  event simultaneo
10570 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65  us access of the
10580 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62   same database b
10590 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y two or more.**
105a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
105b0 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72  tions.  But ther
105c0 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72  e is a serious r
105d0 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a  isk of database.
105e0 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66  ** corruption if
105f0 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   this locking mo
10600 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69  de is used in si
10610 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d  tuations where m
10620 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62  ultiple.** datab
10630 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
10640 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  are accessing th
10650 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
10660 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
10670 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65  .** time and one
10680 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73   or more of thos
10690 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
106a0 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73  e writing..*/..s
106b0 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
106c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
106d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
106e0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52  NotUsed, int *pR
106f0 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  esOut){.  UNUSED
10700 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
10710 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  ed);.  *pResOut 
10720 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
10730 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
10740 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b  c int nolockLock
10750 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
10760 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
10770 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
10780 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
10790 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
107a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
107b0 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
107c0 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  nolockUnlock(sql
107d0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
107e0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
107f0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
10800 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
10810 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
10820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10830 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
10840 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
10850 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  c int nolockClos
10860 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10870 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63  id) {.  return c
10880 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
10890 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
108a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
108b0 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20   the no-op lock 
108c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 0a 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 20  *************** 
109a0 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c  Begin dot-file L
109b0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
109e0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  dotfile locking 
109f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
10a00 73 65 73 20 74 68 65 20 65 78 69 73 74 65 6e 63  ses the existenc
10a10 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f  e of separate lo
10a20 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61  ck.** files (rea
10a30 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 29  lly a directory)
10a40 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
10a50 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
10a60 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a  se.  This works.
10a70 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74  ** on just about
10a80 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65   every filesyste
10a90 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42  m imaginable.  B
10aa0 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72  ut there are ser
10ab0 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a  ious downsides:.
10ac0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
10ad0 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63  ere is zero conc
10ae0 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67  urrency.  A sing
10af0 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73  le reader blocks
10b00 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20   all other.**   
10b10 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
10b20 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f  s from reading o
10b30 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  r writing the da
10b40 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
10b50 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61   (2)  An applica
10b60 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f  tion crash or po
10b70 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61  wer loss can lea
10b80 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69  ve stale lock fi
10b90 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  les.**         s
10ba0 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68  itting around th
10bb0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  at need to be cl
10bc0 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a  eared manually..
10bd0 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65  **.** Neverthele
10be0 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73  ss, a dotlock is
10bf0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
10c00 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72  locking mode for
10c10 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74   use if no.** ot
10c20 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  her locking stra
10c30 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c  tegy is availabl
10c40 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65  e..**.** Dotfile
10c50 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62   locking works b
10c60 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75 62  y creating a sub
10c70 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65  directory in the
10c80 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
10c90 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  as.** the databa
10ca0 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20  se and with the 
10cb0 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69  same name but wi
10cc0 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74  th a ".lock" ext
10cd0 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a  ension added..**
10ce0 20 54 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   The existence o
10cf0 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  f a lock directo
10d00 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  ry implies an EX
10d10 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
10d20 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b  ll other.** lock
10d30 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
10d40 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
10d50 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
10d60 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
10d70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
10d80 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
10d90 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
10da0 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
10db0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
10dc0 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  * lock directory
10dd0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54  ..*/.#define DOT
10de0 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f  LOCK_SUFFIX ".lo
10df0 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ck"../*.** This 
10e00 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
10e10 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
10e20 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
10e30 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
10e40 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
10e50 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
10e60 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
10e70 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
10e80 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
10e90 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
10ea0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
10eb0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
10ec0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
10ed0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
10ee0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
10ef0 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
10f00 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
10f10 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
10f20 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65  **.** In dotfile
10f30 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72   locking, either
10f40 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f   a lock exists o
10f50 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20  r it does not.  
10f60 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61  So in this.** va
10f70 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b  riation of Check
10f80 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20  ReservedLock(), 
10f90 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
10fa0 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c  to true if any l
10fb0 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f  ock.** is held o
10fc0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66  n the file and f
10fd0 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65  alse if the file
10fe0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f   is unlocked..*/
10ff0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11000 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
11010 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11020 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
11030 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
11040 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11050 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
11060 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11070 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11080 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
11090 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
110a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
110b0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
110c0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
110d0 46 69 6c 65 20 29 3b 0a 20 20 72 65 73 65 72 76  File );.  reserv
110e0 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 28 63  ed = osAccess((c
110f0 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65  onst char*)pFile
11100 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
11110 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f 53 54 52 41  , 0)==0;.  OSTRA
11120 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
11130 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
11140 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
11150 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
11160 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
11170 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11190 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
111a0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
111b0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
111c0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
111d0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
111e0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
111f0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
11200 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
11210 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
11220 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
11230 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11240 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11250 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11260 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11270 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
11280 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
11290 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
112a0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
112b0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
112c0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
112d0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
112e0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
112f0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
11300 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
11310 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11320 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11330 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11340 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11350 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11360 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11370 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
11380 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
11390 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
113a0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
113b0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
113c0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
113d0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
113e0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
113f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
11400 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
11410 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11420 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11430 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11440 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11450 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11460 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11470 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11480 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11490 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
114a0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
114b0 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
114c0 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
114d0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
114e0 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
114f0 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
11500 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
11510 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
11520 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
11530 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
11540 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11550 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11560 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
11570 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11580 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
11590 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
115a0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
115b0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
115c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
115d0 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
115e0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
115f0 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
11600 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
11610 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
11620 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
11630 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
11640 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
11650 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
11660 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
11670 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
11680 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
11690 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
116a0 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
116b0 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
116c0 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
116d0 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
116e0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
116f0 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
11700 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
11710 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
11720 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
11730 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
11750 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
11760 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
11770 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c   rc = osMkdir(zL
11780 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a  ockFile, 0777);.
11790 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
117a0 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
117b0 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c  pen/create the l
117c0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ock directory */
117d0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
117e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
117f0 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
11800 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
11810 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
11820 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
11830 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11840 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11850 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11860 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
11870 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11880 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
11890 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
118a0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
118b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
118c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
118d0 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
118e0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
118f0 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
11900 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11910 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11930 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
11940 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
11950 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11960 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
11970 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
11980 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
11990 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
119a0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
119b0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
119c0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
119d0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
119e0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
119f0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
11a00 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
11a10 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
11a20 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
11a30 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   When the lockin
11a40 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20  g level reaches 
11a50 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20  NO_LOCK, delete 
11a60 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  the lock file..*
11a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
11a80 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
11a90 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11aa0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
11ab0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11ac0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11ad0 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
11ae0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
11af0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11b00 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  xt;.  int rc;.. 
11b10 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11b20 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
11b30 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
11b40 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f  %d pid=%d (dotlo
11b50 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
11b60 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
11b70 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
11b80 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
11b90 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72  id(0)));.  asser
11ba0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
11bb0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
11bc0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
11bd0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
11be0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11bf0 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
11c00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11c10 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
11c20 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
11c30 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
11c40 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11c50 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
11c60 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
11c70 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
11c80 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
11c90 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
11ca0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
11cb0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
11cc0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11cd0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
11ce0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11cf0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
11d00 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
11d10 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
11d20 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
11d30 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
11d40 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
11d50 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
11d60 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
11d70 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
11d80 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
11d90 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
11da0 66 28 20 74 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e  f( tErrno==ENOEN
11db0 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  T ){.      rc = 
11dc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
11dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
11de0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11df0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72  LOCK;.      stor
11e00 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
11e10 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
11e20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
11e30 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
11e40 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
11e50 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
11e60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11e70 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
11e80 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
11e90 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
11ea0 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
11eb0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
11ec0 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
11ed0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
11ee0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
11ef0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11f00 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
11f10 69 64 21 3d 30 20 29 3b 0a 20 20 64 6f 74 6c 6f  id!=0 );.  dotlo
11f20 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
11f30 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  LOCK);.  sqlite3
11f40 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
11f50 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
11f60 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
11f70 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a  File(id);.}./***
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11f90 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
11fa0 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
11fb0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
11fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
12020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12080 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
12090 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
120a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
120c0 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
120d0 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
120e0 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
120f0 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
12100 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
12110 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
12120 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
12130 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
12140 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
12150 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
12160 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
12170 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
12180 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
12190 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
121a0 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
121b0 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
121c0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
121d0 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
121e0 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
121f0 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
12200 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
12210 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
12220 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
12230 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
12240 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
12250 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
12260 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
12270 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
12280 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
12290 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
122a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
122b0 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
122c0 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c  d off.*/.#if SQL
122d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
122e0 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
122f0 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
12300 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
12310 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
12320 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
12330 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
12340 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
12350 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
12360 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
12370 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
12380 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
12390 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
123a0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
123b0 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
123c0 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
123d0 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
123e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
123f0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
12400 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
12410 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
12420 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
12430 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
12440 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
12450 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
12460 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
12470 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
12480 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
12490 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
124a0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
124b0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
124c0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
124d0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
124e0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
124f0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
12500 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
12510 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
12520 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12530 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12540 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
12550 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12560 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12570 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12580 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12590 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
125a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
125b0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
125c0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
125d0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
125e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
125f0 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
12600 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
12610 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
12620 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
12630 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
12640 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
12650 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
12660 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
12670 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
12680 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
12690 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
126a0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
126b0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
126c0 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
126d0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
126e0 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
126f0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
12700 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
12710 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
12720 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
12730 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
12740 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
12750 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
12760 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
12770 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
12780 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
12790 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
127a0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
127b0 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
127c0 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
127d0 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
127e0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
127f0 20 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c   .        storeL
12800 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
12810 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
12820 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
12830 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
12840 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12850 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12860 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
12870 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
12880 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69  lse might have i
12890 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
128a0 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
128b0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
128c0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
128d0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20  TE_IOERR_LOCK); 
128e0 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
128f0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
12900 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
12910 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12920 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
12930 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
12940 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  }.    }.  }.  OS
12950 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
12960 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66  LOCK %d %d %d (f
12970 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12980 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
12990 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ));..#ifdef SQLI
129a0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
129b0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
129c0 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49  ( (rc & SQLITE_I
129d0 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
129e0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
129f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12a00 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d   reserved=1;.  }
12a10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12a20 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12a30 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
12a40 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
12a50 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
12a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
12a70 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
12a80 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12a90 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
12aa0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
12ab0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12ac0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
12ad0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
12ae0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
12af0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
12b00 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
12b10 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
12b20 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
12b30 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
12b40 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
12b50 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
12b60 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
12b70 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
12b80 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
12b90 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
12ba0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
12bb0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
12bc0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
12bd0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
12be0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
12bf0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
12c00 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
12c10 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
12c20 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
12c30 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
12c40 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
12c50 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
12c60 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
12c70 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
12c80 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
12c90 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
12ca0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
12cb0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
12cc0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
12cd0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
12ce0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12cf0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
12d00 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
12d10 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c  CLUSIVE.**.** fl
12d20 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c  ock() only reall
12d30 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
12d40 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
12d50 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
12d60 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
12d70 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
12d80 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
12d90 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
12da0 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
12db0 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
12dc0 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
12dd0 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
12de0 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
12df0 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
12e00 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
12e10 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
12e20 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
12e30 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
12e40 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
12e50 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
12e60 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
12e70 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
12e80 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74   flockLock(sqlit
12e90 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12ea0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
12eb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12ec0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
12ed0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12ee0 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
12ef0 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
12f00 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
12f10 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
12f20 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
12f30 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
12f40 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
12f50 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
12f60 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
12f70 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
12f80 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
12f90 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
12fa0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
12fb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12fc0 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
12fd0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
12fe0 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75  */.  .  if (robu
12ff0 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
13000 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
13010 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74  K_NB)) {.    int
13020 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
13030 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67  .    /* didn't g
13040 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79  et, must be busy
13050 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
13060 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
13070 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
13080 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
13090 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
130a0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
130b0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
130c0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
130d0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  no);.    }.  } e
130e0 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74  lse {.    /* got
130f0 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
13100 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
13110 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  */.    pFile->eF
13120 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
13130 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ock;.  }.  OSTRA
13140 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
13150 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22  %s %s (flock)\n"
13160 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
13170 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
13180 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72  ), .           r
13190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
131a0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
131b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
131c0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
131d0 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
131e0 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
131f0 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
13200 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
13210 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
13220 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13230 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
13240 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72  CK_ERRORS */.  r
13250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
13260 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
13270 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
13280 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
13290 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
132a0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
132b0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
132c0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
132d0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
132e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
132f0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
13300 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
13310 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
13320 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
13330 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
13340 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13350 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
13360 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c  tic int flockUnl
13370 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13380 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
13390 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
133a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
133b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61  File*)id;.  .  a
133c0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
133d0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
133e0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
133f0 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c   pid=%d (flock)\
13400 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
13410 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
13420 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13430 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
13440 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
13450 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
13460 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
13470 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
13480 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
13490 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
134a0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
134b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
134c0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
134d0 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
134e0 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
134f0 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
13500 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
13510 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
13520 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
13530 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13540 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
13550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13560 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
13570 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
13580 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75  k. */.  if( robu
13590 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
135a0 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23  h, LOCK_UN) ){.#
135b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
135c0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
135d0 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e  RRORS.    return
135e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
135f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
13600 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13610 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74  RRORS */.    ret
13620 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13630 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  _UNLOCK;.  }else
13640 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13650 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
13660 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13670 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
13680 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
13690 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
136a0 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69   flockClose(sqli
136b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
136c0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
136d0 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  );.  flockUnlock
136e0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
136f0 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
13700 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
13710 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13720 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13730 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
13740 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
13750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
13760 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
13770 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
137a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137e0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
137f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13830 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13850 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
13860 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
13870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13880 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
13890 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
138a0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
138b0 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
138c0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
138d0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
138e0 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
138f0 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
13900 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
13910 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
13920 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
13930 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
13940 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
13950 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
13960 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
13970 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
13980 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
13990 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
139a0 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
139b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
139c0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
139d0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
139e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
139f0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
13a00 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
13a10 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
13a20 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
13a30 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
13a40 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
13a50 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
13a60 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
13a70 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
13a80 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
13a90 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
13aa0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
13ab0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
13ac0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
13ad0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
13ae0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
13af0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
13b00 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
13b10 74 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65 63  tic int semXChec
13b20 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
13b30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13b40 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
13b50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13b60 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
13b70 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
13b80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13b90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
13ba0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
13bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
13bc0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
13bd0 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
13be0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13bf0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
13c00 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
13c10 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
13c20 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
13c30 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13c40 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
13c50 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
13c60 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
13c70 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
13c80 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
13c90 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
13ca0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
13cb0 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20  ed ){.    sem_t 
13cc0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
13cd0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
13ce0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
13cf0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
13d00 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
13d10 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
13d20 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72  f( EAGAIN != tEr
13d30 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rno ){.        r
13d40 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
13d50 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
13d60 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
13d70 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
13d80 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  LOCK);.        s
13d90 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
13da0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
13db0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
13dc0 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
13dd0 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63  else has the loc
13de0 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e  k when we are in
13df0 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20   NO_LOCK */.    
13e00 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28      reserved = (
13e10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13e20 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
13e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
13e40 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
13e50 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
13e60 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
13e70 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
13e80 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
13e90 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
13ea0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
13eb0 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
13ec0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
13ed0 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
13ee0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
13ef0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13f00 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
13f10 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
13f20 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
13f30 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
13f40 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
13f50 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
13f60 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
13f70 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
13f80 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
13f90 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
13fa0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
13fb0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
13fc0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
13fd0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
13fe0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
13ff0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
14000 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
14010 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
14020 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
14030 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
14040 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
14050 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
14060 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
14070 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
14080 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
14090 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
140a0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
140b0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
140c0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
140d0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
140e0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
140f0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
14100 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
14110 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
14120 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
14130 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
14140 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
14150 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14160 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14170 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
14180 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14190 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
141a0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
141b0 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
141c0 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c  locks only reall
141d0 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
141e0 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
141f0 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
14200 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
14210 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
14220 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
14230 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
14240 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
14250 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
14260 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
14270 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
14280 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
14290 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
142a0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
142b0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
142c0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
142d0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
142e0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
142f0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
14300 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
14310 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14320 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65   semXLock(sqlite
14330 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14340 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14350 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14360 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14370 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
14380 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
14390 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Sem;.  int rc = 
143a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
143b0 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
143c0 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
143d0 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
143e0 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
143f0 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
14400 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
14410 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
14420 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
14430 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
14440 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
14450 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20  eLock;.    rc = 
14460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
14470 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14480 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f  ;.  }.  .  /* lo
14490 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77  ck semaphore now
144a0 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68   but bail out wh
144b0 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65  en already locke
144c0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f  d. */.  if( sem_
144d0 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
144e0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
144f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
14500 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14510 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20  ;.  }..  /* got 
14520 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
14530 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
14540 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
14550 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
14560 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
14570 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
14580 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
14590 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
145a0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
145b0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
145c0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
145d0 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
145e0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
145f0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
14600 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
14610 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
14620 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
14630 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
14640 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
14650 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
14660 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
14670 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
14680 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
14690 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
146a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
146b0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
146c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
146d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
146e0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
146f0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
14700 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
14710 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
14720 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
14730 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
14740 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
14750 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
14760 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
14770 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14780 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
14790 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
147a0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
147b0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
147c0 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
147d0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
147e0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
147f0 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
14800 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14810 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
14820 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
14830 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
14840 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
14850 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
14860 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
14870 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
14880 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14890 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
148a0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
148b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
148c0 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20    /* no, really 
148d0 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20  unlock. */.  if 
148e0 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29  ( sem_post(pSem)
148f0 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
14900 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72   rc, tErrno = er
14910 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rno;.    rc = sq
14920 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
14930 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
14940 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
14950 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
14960 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
14970 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
14980 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
14990 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
149a0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
149b0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
149c0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
149d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
149e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
149f0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
14a00 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43  static int semXC
14a10 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
14a20 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
14a30 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
14a40 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
14a50 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
14a60 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  mXUnlock(id, NO_
14a70 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
14a80 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
14a90 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
14aa0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
14ab0 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
14ac0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
14ad0 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
14ae0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
14af0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14b00 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
14b10 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
14b20 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
14b30 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
14b40 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
14b50 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
14b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
14b70 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
14b80 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
14b90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
14bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
14c00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
14c70 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
14c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14ca0 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
14cb0 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
14cc0 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
14cd0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
14ce0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
14cf0 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
14d00 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
14d10 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
14d20 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
14d30 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
14d40 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
14d50 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
14d60 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
14d70 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
14d80 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
14d90 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
14da0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
14db0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
14dc0 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
14dd0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
14de0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
14df0 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
14e00 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
14e10 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
14e20 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
14e30 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
14e40 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
14e50 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
14e60 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
14e70 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
14e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
14e90 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
14ea0 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
14eb0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
14ec0 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
14ed0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
14ee0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
14ef0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
14f00 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
14f10 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14f20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
14f30 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
14f40 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
14f50 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
14f60 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
14f70 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
14f80 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
14f90 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
14fa0 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
14fb0 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
14fc0 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
14fd0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
14fe0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
14ff0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
15000 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
15010 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
15020 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
15050 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
15060 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
15070 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
15080 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15090 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
150a0 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
150b0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
150c0 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
150d0 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
150e0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
150f0 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
15100 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
15110 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
15120 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
15130 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15140 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
15150 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
15160 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
15170 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
15180 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
15190 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
151a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
151b0 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
151c0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
151d0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
151e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
151f0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
15200 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
15210 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15220 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
15230 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
15240 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
15250 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15260 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
15270 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15280 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
15290 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
152a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
152b0 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
152c0 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
152d0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
152e0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
152f0 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
15300 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
15310 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
15320 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
15330 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
15340 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
15350 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
15360 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
15370 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
15380 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
15390 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
153a0 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
153b0 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
153c0 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
153d0 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
153e0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
153f0 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
15400 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
15410 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
15420 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
15430 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
15440 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
15450 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
15460 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
15470 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
15480 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
15490 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
154a0 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
154b0 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
154c0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
154d0 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
154e0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
154f0 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
15500 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
15510 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
15520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15530 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
15540 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15550 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15560 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15570 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
15580 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
15590 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
155a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
155b0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
155c0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
155d0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
155e0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
155f0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
15600 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
15610 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
15620 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
15630 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
15640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15650 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
15660 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
15670 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
15680 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
15690 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
156a0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
156b0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
156c0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
156d0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
156e0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
156f0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
15700 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
15710 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
15720 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
15730 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
15740 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
15750 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
15760 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
15770 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
15780 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
15790 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73   int afpCheckRes
157a0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
157b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
157c0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
157d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
157e0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
157f0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
15800 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15810 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63  le*)id;.  afpLoc
15820 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
15830 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  text;.  .  Simul
15840 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
15850 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15860 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
15870 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
15880 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f  t( pFile );.  co
15890 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
158a0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
158b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
158c0 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65  ext;.  if( conte
158d0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
158e0 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
158f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15900 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
15910 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
15920 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
15930 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
15940 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
15950 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65  s */.  .  /* Che
15960 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
15970 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
15980 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
15990 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
159a0 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
159b0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
159c0 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
159d0 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
159e0 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
159f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
15a00 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
15a10 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
15a20 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
15a30 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
15a40 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
15a50 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
15a60 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
15a70 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
15a80 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
15a90 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
15aa0 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
15ab0 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
15ac0 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
15ad0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
15ae0 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
15af0 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
15b00 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
15b10 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
15b20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15b30 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15b40 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
15b50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
15b60 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
15b70 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
15b80 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
15b90 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
15ba0 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
15bb0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
15bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15bd0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
15be0 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
15bf0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
15c00 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
15c10 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
15c20 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
15c30 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c   %d %d (afp)\n",
15c40 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
15c50 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20  eserved));.  .  
15c60 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
15c70 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
15c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
15c90 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
15ca0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
15cb0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
15cc0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
15cd0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
15ce0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
15cf0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
15d00 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
15d10 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
15d20 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
15d30 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
15d40 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
15d50 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
15d60 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
15d70 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
15d80 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
15d90 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
15da0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
15db0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
15dc0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
15dd0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
15de0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
15df0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
15e00 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
15e10 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
15e20 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
15e30 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
15e40 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
15e50 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
15e60 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
15e70 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
15e80 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
15e90 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
15ea0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
15eb0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
15ec0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
15ed0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
15ee0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
15ef0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
15f00 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
15f10 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
15f20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
15f30 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
15f40 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
15f50 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
15f60 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
15f70 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
15f80 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
15f90 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
15fa0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
15fb0 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69  int afpLock(sqli
15fc0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
15fd0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
15fe0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15ff0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
16000 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16010 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
16020 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
16030 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
16040 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
16050 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
16060 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16070 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
16080 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
16090 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
160a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
160b0 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
160c0 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
160d0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
160e0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
160f0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
16100 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
16110 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
16120 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
16130 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64  azFileLock(pInod
16140 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
16150 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
16160 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
16170 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16180 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
16190 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
161a0 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
161b0 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
161c0 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
161d0 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
161e0 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
161f0 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
16200 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
16210 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
16220 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
16230 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16240 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
16250 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
16260 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
16270 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
16280 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
16290 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
162a0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
162b0 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
162c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
162d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
162e0 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
162f0 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
16300 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
16310 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
16320 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
16330 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
16340 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
16350 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
16360 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
16370 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
16380 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
16390 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
163a0 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
163b0 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
163c0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
163d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
163e0 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
163f0 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
16400 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16410 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
16420 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
16430 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
16440 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16450 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
16460 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
16470 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16480 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
16490 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
164a0 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
164b0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
164c0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
164d0 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
164e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
164f0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
16500 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
16510 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16520 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
16530 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
16540 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
16550 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
16560 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
16570 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
16580 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
16590 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
165a0 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
165b0 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
165c0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
165d0 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
165e0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
165f0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
16600 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
16610 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
16620 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
16630 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
16640 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
16650 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
16660 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
16670 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
16680 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
16690 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
166a0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
166b0 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
166c0 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
166d0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
166e0 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
166f0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16700 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
16710 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
16720 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16730 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
16740 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
16750 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
16760 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
16770 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16780 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
16790 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
167a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
167b0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
167c0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
167d0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
167e0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
167f0 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
16800 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16810 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
16820 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
16830 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
16840 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
16850 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
16860 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
16870 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
16880 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
16890 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
168a0 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
168b0 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
168c0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
168d0 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
168e0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
168f0 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
16900 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
16910 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
16920 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16930 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
16940 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
16950 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
16960 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16970 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16980 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
16990 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
169a0 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
169b0 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
169c0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
169d0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
169e0 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
169f0 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
16a00 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
16a10 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
16a20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
16a30 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
16a40 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
16a50 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
16a60 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
16a70 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16a80 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
16a90 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20  lrc2, lrc1Errno 
16aa0 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  = 0;.    long lk
16ab0 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
16ac0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16ad0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
16ae0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16af0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
16b00 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
16b10 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
16b20 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
16b30 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
16b40 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
16b50 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
16b60 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
16b70 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
16b80 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
16b90 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
16ba0 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
16bb0 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
16bc0 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
16bd0 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
16be0 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
16bf0 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
16c00 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
16c10 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
16c20 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16c30 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
16c40 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
16c50 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16c60 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
16c70 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16c80 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
16c90 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
16ca0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
16cb0 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
16cc0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
16cd0 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
16ce0 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
16cf0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16d00 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
16d10 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
16d20 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
16d30 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
16d40 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f 72  ) ) {.      stor
16d50 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
16d60 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20  , lrc1Errno);.  
16d70 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
16d80 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16d90 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
16da0 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
16db0 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
16dc0 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
16dd0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16de0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
16df0 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
16e00 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
16e10 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
16e20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
16e30 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16e40 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
16e50 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
16e60 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
16e70 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
16e80 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
16e90 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
16ea0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
16eb0 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
16ec0 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
16ed0 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
16ee0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
16ef0 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
16f00 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
16f10 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
16f20 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
16f30 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
16f40 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
16f50 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
16f60 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
16f70 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
16f80 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
16f90 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
16fa0 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
16fb0 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
16fc0 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
16fd0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
16fe0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
16ff0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
17000 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
17010 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
17020 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17030 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c   );.    if (eFil
17040 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45  eLock >= RESERVE
17050 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
17060 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53  >eFileLock < RES
17070 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
17080 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
17090 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
170a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
170b0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
170c0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
170d0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
170e0 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
170f0 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29     if( !failed )
17100 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78  {.        contex
17110 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b  t->reserved = 1;
17120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17130 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
17140 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45  & eFileLock == E
17150 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
17160 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72  .      /* Acquir
17170 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
17180 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a  ock */.        .
17190 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
171a0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
171b0 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68  before trying th
171c0 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20  e range.  we'll 
171d0 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a  need to .      *
171e0 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  * reestablish th
171f0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
17200 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68   we can't get th
17210 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20  e  afpUnlock.   
17220 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
17230 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65  !(failed = afpSe
17240 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17250 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
17260 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68        pInode->sh
17290 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
172a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
172b0 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
172c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
172d0 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
172e0 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
172f0 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
17300 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
17310 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17320 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17330 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
17340 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
17370 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
17380 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
17390 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
173a0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
173b0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
173d0 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49  HARED_FIRST + pI
173e0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
173f0 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
17400 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
17410 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
17420 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
17430 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
17440 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
17450 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
17460 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
17470 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17480 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
17490 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
174a0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
174b0 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
174c0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
174d0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
174e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
174f0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
17500 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
17510 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
17520 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
17530 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17540 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
17550 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
17560 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
17570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17580 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
17590 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
175a0 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
175b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
175c0 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
175d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
175e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
175f0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17600 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
17610 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
17620 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
17630 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
17640 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
17650 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
17660 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
17670 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
17680 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17690 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
176a0 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
176b0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
176c0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
176d0 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
176e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
176f0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
17700 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
17710 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
17720 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
17730 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
17740 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
17750 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
17760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
17770 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
17780 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
17790 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
177a0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
177b0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
177c0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
177d0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
177e0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
177f0 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69  t afpUnlock(sqli
17800 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17810 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
17820 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17830 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
17840 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17850 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
17860 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
17870 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
17880 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
17890 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
178a0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
178b0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
178c0 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
178d0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
178e0 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
178f0 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
17900 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
17910 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
17920 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
17930 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
17940 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
17950 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
17960 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
17970 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
17980 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
17990 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
179a0 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
179b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
179c0 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61  etpid(0)));..  a
179d0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
179e0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
179f0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
17a00 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
17a10 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
17a20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17a30 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17a40 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
17a50 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
17a60 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17a70 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
17a80 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
17a90 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
17aa0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17ab0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17ac0 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
17ad0 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
17ae0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17af0 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
17b00 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
17b10 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
17b20 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
17b30 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
17b40 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
17b50 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
17b60 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
17b70 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
17b80 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
17b90 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
17ba0 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
17bb0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
17bc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
17bd0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
17be0 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
17bf0 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
17c00 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
17c10 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
17c20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17c30 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
17c40 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
17c50 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
17c60 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
17c70 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
17c80 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
17c90 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
17ca0 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
17cb0 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
17cc0 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
17cd0 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
17ce0 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
17cf0 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
17d00 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
17d10 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
17d20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
17d30 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d  >inNormalWrite==
17d40 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
17d50 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
17d60 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
17d70 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
17d80 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20  rChng==1 );.    
17d90 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
17da0 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
17db0 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46  .    .    if( pF
17dc0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
17dd0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
17de0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
17df0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17e00 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17e10 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48  SHARED_FIRST, SH
17e20 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
17e30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17e40 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65  ITE_OK && (eFile
17e50 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17e60 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K || pInode->nSh
17e70 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20  ared>1) ){.     
17e80 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
17e90 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
17ea0 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
17eb0 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
17ec0 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
17ed0 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
17ee0 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
17ef0 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63  Byte;.        rc
17f00 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17f10 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17f20 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
17f30 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
17f40 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
17f50 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d      skipShared =
17f60 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17f70 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
17f80 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
17f90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
17fa0 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
17fb0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
17fc0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17fd0 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
17fe0 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
17ff0 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72      } .    if( r
18000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18010 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18020 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
18030 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  && context->rese
18040 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  rved ){.      rc
18050 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18060 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18070 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
18080 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
18090 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20    if( !rc ){ .  
180a0 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
180b0 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20  eserved = 0; .  
180c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
180d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
180e0 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
180f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
18100 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
18110 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  1)){.      pInod
18120 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
18130 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
18140 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
18150 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69  SQLITE_OK && eFi
18160 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
18170 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  ){..    /* Decre
18180 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
18190 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
181a0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
181b0 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
181c0 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
181d0 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
181e0 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
181f0 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
18200 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
18210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73  ..    */.    uns
18220 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
18230 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
18240 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
18250 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
18260 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
18270 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
18280 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d  ==0 ){.      Sim
182a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
182b0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
182c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
182d0 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
182e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
182f0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
18300 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a   !skipShared ){.
18310 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
18320 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18330 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18340 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
18350 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
18360 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
18370 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
18380 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
18390 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
183a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
183b0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
183c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
183d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
183e0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
183f0 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
18400 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
18410 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ck>=0 );.      i
18420 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
18430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
18440 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
18450 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
18460 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
18470 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
18480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18490 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
184a0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
184b0 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
184c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
184d0 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70  a file & cleanup
184e0 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f   AFP specific lo
184f0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a  cking context .*
18500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
18510 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
18520 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
18530 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18540 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18550 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18560 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  d;.  assert( id!
18570 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f 63  =0 );.  afpUnloc
18580 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
18590 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
185a0 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ();.  if( pFile-
185b0 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65  >pInode && pFile
185c0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
185d0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
185e0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
185f0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
18600 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
18610 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
18620 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
18630 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
18640 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
18650 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
18660 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73   file.    ** des
18670 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
18680 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
18690 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
186a0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
186b0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  en.    ** the la
186c0 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
186d0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
186e0 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
186f0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  e);.  }.  releas
18700 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
18710 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
18720 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
18730 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20 3d  Context);.  rc =
18740 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
18750 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
18760 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
18770 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
18780 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
18790 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
187a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
187b0 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
187c0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
187d0 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
187e0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
187f0 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
18800 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
18810 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
18820 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
18830 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
18840 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
18850 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79  available.  If y
18860 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65  ou don't compile
18870 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e   for a mac, then
18880 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a   the "unix-afp".
18890 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76  ** VFS is not av
188a0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ailable..**.****
188b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188c0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50  * End of the AFP
188d0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
188e0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
188f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
18900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
18950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
189a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189b0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
189c0 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FS Locking *****
189d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69  ***********/..#i
189f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
18a00 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18a10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18a20 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72  YLE./*. ** Lower
18a30 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
18a40 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
18a50 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
18a60 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
18a70 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65  Lock. ** must be
18a80 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
18a90 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
18aa0 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c   **. ** If the l
18ab0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
18ac0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
18ad0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
18ae0 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74  t or below. ** t
18af0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
18b00 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
18b10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
18b20 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  -op.. */.static 
18b30 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71  int nfsUnlock(sq
18b40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18b50 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
18b60 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
18b70 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
18b80 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ck, 1);.}..#endi
18b90 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
18ba0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18bb0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18bc0 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
18bd0 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
18be0 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  s the NFS lock i
18bf0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
18c00 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
18c10 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
18c20 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
18c30 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
18c40 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
18c50 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
18c60 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a  is available.  .
18c70 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18c80 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
18c90 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
18ca0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
18cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cc0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d10 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
18d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d60 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
18d70 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67  **** Non-locking
18d80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
18d90 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
18da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18db0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ***.**.** The ne
18dc0 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  xt division cont
18dd0 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ains implementat
18de0 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74  ions for all met
18df0 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  hods of the .** 
18e00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
18e10 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ect other than t
18e20 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  he locking metho
18e30 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ds.  The locking
18e40 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65  .** methods were
18e50 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69   defined in divi
18e60 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65  sions above (one
18e70 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
18e80 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29  per.** division)
18e90 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73  .  Those methods
18ea0 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
18eb0 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
18ec0 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74  modes.** are gat
18ed0 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74  her together int
18ee0 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e  o this division.
18ef0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .*/../*.** Seek 
18f00 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61  to the offset pa
18f10 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
18f20 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65  nd argument, the
18f30 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62  n read cnt .** b
18f40 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20  ytes into pBuf. 
18f50 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18f60 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
18f70 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  lly read..**.** 
18f80 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69  NB:  If you defi
18f90 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20  ne USE_PREAD or 
18fa0 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65  USE_PREAD64, the
18fb0 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a  n it might also.
18fc0 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
18fd0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
18fe0 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30  _SOURCE to be 50
18ff0 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20  0.  This varies 
19000 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74  from.** one syst
19010 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  em to another.  
19020 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65  Since SQLite doe
19030 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45  s not define USE
19040 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79  _PREAD.** in any
19050 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
19060 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
19070 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
19080 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
19090 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
190a0 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
190b0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
190c0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
190d0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
190e0 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
190f0 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
19100 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
19110 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
19120 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
19130 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
19140 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
19150 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
19160 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
19170 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69  t got;.  int pri
19180 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65  or = 0;.#if (!de
19190 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
191a0 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
191b0 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
191c0 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
191d0 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
191e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  ;.  assert( cnt=
191f0 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20 29  =(cnt&0x1ffff) )
19200 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e  ;.  assert( id->
19210 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69 66  h>2 );.  do{.#if
19220 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19230 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
19240 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
19250 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
19260 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19270 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
19280 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
19290 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
192a0 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
192b0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
192c0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
192d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
192e0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
192f0 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
19300 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
19310 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
19320 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19330 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
19340 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
19350 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
19360 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
19370 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
19380 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
19390 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
193a0 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  e*)id, errno);. 
193b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
193c0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
193d0 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
193e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
193f0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19400 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
19410 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
19420 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
19430 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
19440 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
19450 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
19460 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
19470 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
19480 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
19490 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
194a0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
194b0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
194c0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
194d0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
194e0 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
194f0 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
19500 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
19510 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
19520 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
19530 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
19540 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
19550 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
19560 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
19570 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
19580 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
19590 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
195a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
195b0 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
195c0 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
195d0 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
195e0 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
195f0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
19600 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
19610 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
19620 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
19630 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
19640 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
19650 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
19660 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
19670 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
19680 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
19690 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
196a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
196b0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
196c0 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
196d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
196e0 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
196f0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19700 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
19710 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
19720 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
19730 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
19740 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
19750 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
19760 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19770 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
19780 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
19790 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
197a0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
197b0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
197c0 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
197d0 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
197e0 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
197f0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
19800 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
19810 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
19820 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
19830 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
19840 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
19850 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
19860 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
19870 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
19880 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
19890 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75  f this read requ
198a0 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
198b0 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
198c0 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
198d0 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
198e0 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
198f0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
19900 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
19910 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
19920 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
19930 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
19940 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
19950 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
19960 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
19970 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20  fset], amt);.   
19980 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19990 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
199a0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
199b0 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
199c0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
199d0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
199e0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
199f0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
19a00 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
19a10 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
19a20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
19a30 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
19a40 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
19a50 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
19a60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67  .  }.#endif..  g
19a70 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
19a80 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
19a90 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
19aa0 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
19ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19ac0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
19ad0 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
19ae0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
19af0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
19b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19b10 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
19b20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65  }else{.    store
19b30 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
19b40 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20   0);   /* not a 
19b50 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
19b60 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
19b70 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
19b80 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
19b90 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
19ba0 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
19bb0 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d  f)[got], 0, amt-
19bc0 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  got);.    return
19bd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
19be0 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a  ORT_READ;.  }.}.
19bf0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
19c00 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d  o seek the file-
19c10 64 65 73 63 72 69 70 74 6f 72 20 70 61 73 73 65  descriptor passe
19c20 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
19c30 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62  rgument to.** ab
19c40 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f  solute offset iO
19c50 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  ff, then attempt
19c60 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62   to write nBuf b
19c70 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f  ytes of data fro
19c80 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e  m.** pBuf to it.
19c90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
19ca0 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61  urs, return -1 a
19cb0 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e  nd set *piErrno.
19cc0 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
19cd0 72 65 74 75 72 6e 20 74 68 65 20 61 63 74 75 61  return the actua
19ce0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
19cf0 73 20 77 72 69 74 74 65 6e 20 28 77 68 69 63 68  s written (which
19d00 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61   may be less tha
19d10 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73  n.** nBuf)..*/.s
19d20 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
19d30 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20  dWriteFd(.  int 
19d40 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
19d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19d60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
19d70 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
19d80 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20  i64 iOff,       
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74  /* File offset t
19db0 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
19dc0 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  at */.  const vo
19dd0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
19de0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
19df0 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62  data from this b
19e00 75 66 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c  uffer to the fil
19e10 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c  e */.  int nBuf,
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
19e40 66 20 62 75 66 66 65 72 20 70 42 75 66 20 69 6e  f buffer pBuf in
19e50 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
19e60 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20  *piErrno        
19e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
19e80 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72  UT: Error number
19e90 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73   if error occurs
19ea0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
19eb0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
19ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
19ed0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 79  e returned by sy
19ee0 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  stem call */..  
19ef0 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e  assert( nBuf==(n
19f00 42 75 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a  Buf&0x1ffff) );.
19f10 20 20 61 73 73 65 72 74 28 20 66 64 3e 32 20 29    assert( fd>2 )
19f20 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78 31 66  ;.  nBuf &= 0x1f
19f30 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41  fff;.  TIMER_STA
19f40 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  RT;..#if defined
19f50 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f  (USE_PREAD).  do
19f60 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77  { rc = (int)osPw
19f70 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e  rite(fd, pBuf, n
19f80 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69  Buf, iOff); }whi
19f90 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
19fa0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69  o==EINTR );.#eli
19fb0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
19fc0 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 72 63 20  EAD64).  do{ rc 
19fd0 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 36  = (int)osPwrite6
19fe0 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  4(fd, pBuf, nBuf
19ff0 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28 20  , iOff);}while( 
1a000 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1a010 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64  INTR);.#else.  d
1a020 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65 65 6b  o{.    i64 iSeek
1a030 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f 66   = lseek(fd, iOf
1a040 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  f, SEEK_SET);.  
1a050 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a060 72 28 20 69 53 65 65 6b 2d 2d 20 29 3b 0a 0a 20  r( iSeek-- );.. 
1a070 20 20 20 69 66 28 20 69 53 65 65 6b 21 3d 69 4f     if( iSeek!=iO
1a080 66 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ff ){.      if( 
1a090 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72  piErrno ) *piErr
1a0a0 6e 6f 20 3d 20 28 69 53 65 65 6b 3d 3d 2d 31 20  no = (iSeek==-1 
1a0b0 3f 20 65 72 72 6e 6f 20 3a 20 30 29 3b 0a 20 20  ? errno : 0);.  
1a0c0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1a0d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
1a0e0 57 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  Write(fd, pBuf, 
1a0f0 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28  nBuf);.  }while(
1a100 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1a110 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
1a120 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1a130 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
1a140 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1a150 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63   %llu\n", fd, rc
1a160 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c  , iOff, TIMER_EL
1a170 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66 28 20  APSED));..  if( 
1a180 72 63 3c 30 20 26 26 20 70 69 45 72 72 6e 6f 20  rc<0 && piErrno 
1a190 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72 72  ) *piErrno = err
1a1a0 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  no;.  return rc;
1a1b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .}.../*.** Seek 
1a1c0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
1a1d0 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
1a1e0 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
1a1f0 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
1a200 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1a210 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1a220 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
1a230 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
1a240 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
1a250 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
1a260 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
1a270 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
1a280 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1a290 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1a2a0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1a2b0 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1a2c0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
1a2d0 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
1a2e0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
1a2f0 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e 20   cnt){.  return 
1a300 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 69  seekAndWriteFd(i
1a310 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70 42  d->h, offset, pB
1a320 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61  uf, cnt, &id->la
1a330 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a  stErrno);.}.../*
1a340 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
1a350 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
1a360 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
1a370 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1a380 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
1a390 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
1a3a0 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
1a3b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1a3c0 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
1a3d0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
1a3e0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1a3f0 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1a400 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1a410 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
1a420 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1a430 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
1a440 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
1a450 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1a460 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
1a470 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a480 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1a490 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
1a4a0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
1a4b0 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
1a4c0 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
1a4d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1a4e0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
1a4f0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1a500 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
1a510 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
1a520 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
1a530 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
1a540 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
1a550 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
1a560 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
1a570 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   );.#endif..#ifd
1a580 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1a590 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1a5a0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1a5b0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1a5c0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1a5d0 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
1a5e0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1a5f0 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1a600 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1a610 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
1a620 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1a630 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
1a640 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1a650 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
1a660 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
1a670 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
1a680 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
1a690 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
1a6a0 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
1a6b0 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
1a6c0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1a6d0 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
1a6e0 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
1a6f0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1a700 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
1a710 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
1a720 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
1a730 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
1a740 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1a750 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
1a760 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
1a770 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1a780 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
1a790 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
1a7a0 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
1a7b0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1a7c0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1a7d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a7e0 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
1a7f0 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
1a800 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
1a810 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
1a820 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1a830 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
1a840 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1a850 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
1a860 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
1a870 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1a880 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1a890 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49  ITE_MMAP_READWRI
1a8a0 54 45 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41  TE) && SQLITE_MA
1a8b0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a8c0 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
1a8d0 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72 69  much of this wri
1a8e0 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  te request as po
1a8f0 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
1a900 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
1a910 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
1a920 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
1a930 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
1a940 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
1a950 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1a960 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
1a970 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1a980 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
1a990 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
1a9a0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1a9b0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d  ffset], pBuf, am
1a9c0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1a9d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a9e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1a9f0 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e   nCopy = pFile->
1aa00 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65  mmapSize - offse
1aa10 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  t;.      memcpy(
1aa20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1aa30 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1aa40 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70  set], pBuf, nCop
1aa50 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
1aa60 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
1aa70 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
1aa80 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
1aa90 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
1aaa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1aab0 69 66 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77  if. .  while( (w
1aac0 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rote = seekAndWr
1aad0 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ite(pFile, offse
1aae0 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61  t, pBuf, amt))<a
1aaf0 6d 74 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b  mt && wrote>0 ){
1ab00 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
1ab10 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
1ab20 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
1ab30 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
1ab40 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
1ab50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1ab60 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
1ab70 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
1ab80 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1ab90 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
1aba0 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
1abb0 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28  wrote ){.    if(
1abc0 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c   wrote<0 && pFil
1abd0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e  e->lastErrno!=EN
1abe0 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OSPC ){.      /*
1abf0 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
1ac00 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a  y seekAndWrite *
1ac10 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1ac20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
1ac30 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
1ac40 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1ac50 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a  no(pFile, 0); /*
1ac60 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
1ac70 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ror */.      ret
1ac80 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
1ac90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1aca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1acb0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1acc0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
1acd0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1ace0 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
1acf0 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
1ad00 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
1ad10 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
1ad20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
1ad30 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74  e occurring at t
1ad40 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
1ad50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1ad60 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
1ad70 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
1ad80 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
1ad90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  endif../*.** We 
1ada0 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73  do not trust sys
1adb0 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20  tems to provide 
1adc0 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73  a working fdatas
1add0 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e  ync().  Some do.
1ade0 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f  .** Others do no
1adf0 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77  .  To be safe, w
1ae00 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74  e will stick wit
1ae10 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20  h the (slightly 
1ae20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63  slower).** fsync
1ae30 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20  (). If you know 
1ae40 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d  that your system
1ae50 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64   does support fd
1ae60 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63  atasync() correc
1ae70 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d  tly,.** then sim
1ae80 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68  ply compile with
1ae90 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61   -Dfdatasync=fda
1aea0 74 61 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45  tasync or -DHAVE
1aeb0 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69  _FDATASYNC.*/.#i
1aec0 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74 61  f !defined(fdata
1aed0 73 79 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46  sync) && !HAVE_F
1aee0 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e  DATASYNC.# defin
1aef0 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e  e fdatasync fsyn
1af00 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  c.#endif../*.** 
1af10 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  Define HAVE_FULL
1af20 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20  FSYNC to 0 or 1 
1af30 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
1af40 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
1af50 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d  he F_FULLFSYNC m
1af60 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e  acro is defined.
1af70 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73    F_FULLFSYNC is
1af80 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e   currently.** on
1af90 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
1afa0 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74  Mac OS X.  But t
1afb0 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65  hat could change
1afc0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55  ..*/.#ifdef F_FU
1afd0 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  LLFSYNC.# define
1afe0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1aff0 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
1b000 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1b010 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
1b020 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
1b030 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
1b040 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
1b050 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
1b060 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
1b070 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
1b080 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
1b090 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
1b0a0 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
1b0b0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1b0c0 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
1b0d0 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
1b0e0 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
1b0f0 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
1b100 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
1b110 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
1b120 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
1b130 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
1b140 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
1b150 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
1b160 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
1b170 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
1b180 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
1b190 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
1b1a0 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
1b1b0 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
1b1c0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
1b1d0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
1b1e0 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
1b1f0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  e file..**.** SQ
1b200 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61  Lite sets the da
1b210 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74  taOnly flag if t
1b220 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1b230 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ile is unchanged
1b240 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65  ..** The idea be
1b250 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73  hind dataOnly is
1b260 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
1b270 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66  only write the f
1b280 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74  ile content.** t
1b290 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20  o disk, not the 
1b2a0 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20  inode.  We only 
1b2b0 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20  set dataOnly if 
1b2c0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
1b2d0 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73   .** unchanged s
1b2e0 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69  ince the file si
1b2f0 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ze is part of th
1b300 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65  e inode.  Howeve
1b310 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20  r, .** Ted Ts'o 
1b320 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64  tells us that fd
1b330 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61  atasync() will a
1b340 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e  lso write the in
1b350 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69  ode if the.** fi
1b360 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e  le size has chan
1b370 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72  ged.  The only r
1b380 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62  eal difference b
1b390 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63  etween fdatasync
1b3a0 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28  ().** and fsync(
1b3b0 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c  ), Ted tells us,
1b3c0 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79   is that fdatasy
1b3d0 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c  nc() will not fl
1b3e0 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65  ush the.** inode
1b3f0 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72   if the mtime or
1b400 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20   owner or other 
1b410 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73  inode attributes
1b420 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a   have changed..*
1b430 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61  * We only care a
1b440 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69  bout the file si
1b450 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65  ze, not the othe
1b460 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65  r file attribute
1b470 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20  s, so.** as far 
1b480 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e  as SQLite is con
1b490 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61  cerned, an fdata
1b4a0 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73  sync() is always
1b4b0 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f   adequate..** So
1b4c0 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
1b4d0 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69  fdatasync() if i
1b4e0 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  t is available, 
1b4f0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a  regardless of.**
1b500 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1b510 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e  e dataOnly flag.
1b520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1b530 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64  ull_fsync(int fd
1b540 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20  , int fullSync, 
1b550 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20  int dataOnly){. 
1b560 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
1b570 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66  he following "if
1b580 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20  def/elif/else/" 
1b590 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61  block has the sa
1b5a0 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a  me structure as.
1b5b0 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c    ** the one bel
1b5c0 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63  ow. It is replic
1b5d0 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79  ated here solely
1b5e0 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65   to avoid clutte
1b5f0 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68  ring .  ** up th
1b600 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68  e real code with
1b610 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41   the UNUSED_PARA
1b620 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a  METER() macros..
1b630 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1b640 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55  TE_NO_SYNC.  UNU
1b650 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1b660 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1b670 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
1b680 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b690 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1b6a0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1b6b0 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1b6c0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1b6d0 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
1b6e0 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
1b6f0 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
1b700 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1b710 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  y);.#endif..  /*
1b720 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
1b730 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
1b740 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
1b750 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
1b760 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
1b770 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
1b780 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
1b790 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
1b7a0 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
1b7b0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
1b7c0 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
1b7d0 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
1b7e0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
1b7f0 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
1b800 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1b810 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
1b820 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
1b830 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
1b840 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
1b850 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
1b860 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
1b870 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
1b880 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
1b890 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1b8a0 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  .  rc = SQLITE_O
1b8b0 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  K;.#elif HAVE_FU
1b8c0 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75  LLFSYNC.  if( fu
1b8d0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  llSync ){.    rc
1b8e0 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46   = osFcntl(fd, F
1b8f0 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a  _FULLFSYNC, 0);.
1b900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1b910 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
1b920 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
1b930 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
1b940 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
1b950 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
1b960 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
1b970 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
1b980 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
1b990 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
1b9a0 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
1b9b0 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
1b9c0 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
1b9d0 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
1b9e0 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1b9f0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
1ba00 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
1ba10 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
1ba20 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
1ba30 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
1ba40 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
1ba50 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
1ba60 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
1ba70 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
1ba80 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
1ba90 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
1baa0 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
1bab0 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
1bac0 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
1bad0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
1bae0 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
1baf0 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ;..#elif defined
1bb00 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a  (__APPLE__).  /*
1bb10 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20   fdatasync() on 
1bb20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74  HFS+ doesn't yet
1bb30 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20   flush the file 
1bb40 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67  size if it chang
1bb50 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1bb60 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77  * so currently w
1bb70 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65  e default to the
1bb80 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65   macro that rede
1bb90 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20  fines fdatasync 
1bba0 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20  to fsync.  */.  
1bbb0 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1bbc0 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64  #else .  rc = fd
1bbd0 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66  atasync(fd);.#if
1bbe0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1bbf0 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e  ( rc==-1 && errn
1bc00 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20  o==ENOTSUP ){.  
1bc10 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1bc20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1bc30 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65  OS_VXWORKS */.#e
1bc40 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
1bc50 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69  LITE_NO_SYNC eli
1bc60 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1bc70 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58   */..  if( OS_VX
1bc80 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31  WORKS && rc!= -1
1bc90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1bca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1bcb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1bcc0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1bcd0 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
1bce0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
1bcf0 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
1bd00 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
1bd10 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
1bd20 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
1bd30 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
1bd40 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1bd50 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
1bd60 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
1bd70 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
1bd80 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
1bd90 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
1bda0 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
1bdb0 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
1bdc0 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
1bdd0 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   The directory f
1bde0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1bdf0 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20  s used for only 
1be00 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a  one thing - to.*
1be10 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65  * fsync() a dire
1be20 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75  ctory to make su
1be30 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  re file creation
1be40 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76   and deletion ev
1be50 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73  ents.** are flus
1be60 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75  hed to disk.  Su
1be70 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f  ch fsyncs are no
1be80 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65  t needed on newe
1be90 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20  r.** journaling 
1bea0 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74  filesystems, but
1beb0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
1bec0 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65   older filesyste
1bed0 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1bee0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76  outine can be ov
1bef0 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1bf00 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69  he xSetSysCall i
1bf10 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65  nterface..** The
1bf20 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72   ability to over
1bf30 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ride this routin
1bf40 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73  e was added in s
1bf50 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a  upport of the.**
1bf60 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1bf70 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69  x.  Opening a di
1bf80 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63  rectory is a sec
1bf90 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61  urity risk (we a
1bfa0 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d  re.** told) so m
1bfb0 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64  aking it overrid
1bfc0 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65  eable allows the
1bfd0 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1bfe0 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20  x to.** replace 
1bff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
1c000 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  h a harmless no-
1c010 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69  op.  To make thi
1c020 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e  s routine.** a n
1c030 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74  o-op, replace it
1c040 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61   with a stub tha
1c050 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1c060 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a  _OK but leaves.*
1c070 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20  * *pFd set to a 
1c080 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1c090 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1c0a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1c0b0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1c0c0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1c0d0 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1c0e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1c0f0 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1c100 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c110 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1c120 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1c130 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1c140 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1c150 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1c160 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1c170 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1c180 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1c190 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1c1a0 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1c1b0 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1c1c0 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1c1d0 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20  rname); ii>1 && 
1c1e0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1c1f0 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1c200 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1c210 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1c220 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
1c230 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20  _open(zDirname, 
1c240 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
1c250 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66  Y, 0);.    if( f
1c260 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53  d>=0 ){.      OS
1c270 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20  TRACE(("OPENDIR 
1c280 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20  %-3d %s\n", fd, 
1c290 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20  zDirname));.    
1c2a0 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66  }.  }.  *pFd = f
1c2b0 64 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29  d;.  if( fd>=0 )
1c2c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c2d0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 75 6e 69 78  K;.  return unix
1c2e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1c2f0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
1c300 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20  openDirectory", 
1c310 7a 44 69 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  zDirname);.}../*
1c320 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
1c330 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
1c340 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
1c350 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
1c360 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  isk..**.** If da
1c370 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62  taOnly==0 then b
1c380 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73  oth the file its
1c390 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61  elf and its meta
1c3a0 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69  data (file.** si
1c3b0 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c  ze, access time,
1c3c0 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64   etc) are synced
1c3d0 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d  .  If dataOnly!=
1c3e0 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a  0 then only the.
1c3f0 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20  ** file data is 
1c400 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e  synced..**.** Un
1c410 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d  der Unix, also m
1c420 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1c430 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1c440 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a  y for the file.*
1c450 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
1c460 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20  ed by fsync-ing 
1c470 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
1c480 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1c490 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64  file..** If we d
1c4a0 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e  o not do this an
1c4b0 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61  d we encounter a
1c4c0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
1c4d0 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
1c4e0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
1c4f0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
1c500 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20   exist after we 
1c510 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78  reboot.  The nex
1c520 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61  t.** SQLite to a
1c530 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77  ccess the file w
1c540 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61  ill not know tha
1c550 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78  t the journal ex
1c560 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a  ists (because.**
1c570 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1c580 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
1c590 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63  rnal was never c
1c5a0 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20  reated) and the 
1c5b0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
1c5c0 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63  ill not roll bac
1c5d0 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61  k - possibly lea
1c5e0 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
1c5f0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
1c600 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1c610 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
1c620 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
1c630 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
1c640 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1c650 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
1c660 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79    int isDataOnly
1c670 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45   = (flags&SQLITE
1c680 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b  _SYNC_DATAONLY);
1c690 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e  .  int isFullsyn
1c6a0 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29  c = (flags&0x0F)
1c6b0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1c6c0 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  LL;..  /* Check 
1c6d0 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
1c6e0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
1c6f0 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
1c700 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
1c710 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1c720 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
1c730 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
1c740 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1c750 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
1c760 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
1c770 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
1c780 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1c790 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
1c7a0 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
1c7b0 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
1c7c0 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
1c7d0 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
1c7e0 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
1c7f0 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
1c800 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1c810 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73  TE_FULL );..  as
1c820 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
1c830 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
1c840 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
1c850 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66  e->h));.  rc = f
1c860 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
1c870 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20  >h, isFullsync, 
1c880 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53  isDataOnly);.  S
1c890 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1c8a0 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1c8b0 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
1c8c0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
1c8d0 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
1c8e0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1c8f0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
1c900 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20  , "full_fsync", 
1c910 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1c920 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73   }..  /* Also fs
1c930 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
1c940 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
1c950 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52   file if the DIR
1c960 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69  SYNC flag.  ** i
1c970 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20  s set.  This is 
1c980 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72  a one-time occur
1c990 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73  rence.  Many sys
1c9a0 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20  tems (examples: 
1c9b0 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e  AIX).  ** are un
1c9c0 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20  able to fsync a 
1c9d0 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67  directory, so ig
1c9e0 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74  nore errors on t
1c9f0 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20  he fsync..  */. 
1ca00 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
1ca10 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
1ca20 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20  _DIRSYNC ){.    
1ca30 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f  int dirfd;.    O
1ca40 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43  STRACE(("DIRSYNC
1ca50 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73   %s (have_fullfs
1ca60 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
1ca70 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a  %d)\n", pFile->z
1ca80 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20  Path,.          
1ca90 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
1caa0 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a  , isFullsync));.
1cab0 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
1cac0 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e  irectory(pFile->
1cad0 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
1cae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1caf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
1cb00 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c  ull_fsync(dirfd,
1cb10 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f   0, 0);.      ro
1cb20 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
1cb30 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
1cb40 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  _);.    }else{. 
1cb50 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
1cb60 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
1cb70 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   );.      rc = S
1cb80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1cb90 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
1cba0 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c  lags &= ~UNIXFIL
1cbb0 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20  E_DIRSYNC;.  }. 
1cbc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cbd0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
1cbe0 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
1cbf0 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
1cc00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1cc10 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
1cc20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1cc30 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69  nByte){.  unixFi
1cc40 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1cc50 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
1cc60 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1cc70 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
1cc80 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1cc90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1cca0 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f  TRUNCATE );..  /
1ccb0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
1ccc0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
1ccd0 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
1cce0 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
1ccf0 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
1cd00 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
1cd10 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
1cd20 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
1cd30 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
1cd40 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
1cd50 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
1cd60 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
1cd70 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
1cd80 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
1cd90 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
1cda0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
1cdb0 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
1cdc0 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
1cdd0 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
1cde0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1cdf0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1ce00 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73   }..  rc = robus
1ce10 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1ce20 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20  e->h, nByte);.  
1ce30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74  if( rc ){.    st
1ce40 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1ce50 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
1ce60 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1ce70 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1ce80 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1ce90 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1cea0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
1ceb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1cec0 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
1ced0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1cee0 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1cef0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1cf00 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
1cf10 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1cf20 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1cf30 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1cf40 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1cf50 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
1cf60 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1cf70 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
1cf80 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1cf90 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
1cfa0 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
1cfb0 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1cfc0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
1cfd0 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1cfe0 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
1cff0 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
1d000 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
1d010 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
1d020 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
1d030 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
1d040 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1d050 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1d060 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1d070 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1d080 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
1d090 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   }.#endif..#if S
1d0a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1d0b0 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20  IZE>0.    /* If 
1d0c0 74 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73  the file was jus
1d0d0 74 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61  t truncated to a
1d0e0 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68   size smaller th
1d0f0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  an the currently
1d100 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  .    ** mapped r
1d110 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
1d120 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
1d130 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
1d140 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
1d150 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20    ** use read() 
1d160 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61  and write() to a
1d170 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e  ccess data beyon
1d180 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f  d this point fro
1d190 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20  m now on.  .    
1d1a0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  */.    if( nByte
1d1b0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
1d1c0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1d1d0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74  >mmapSize = nByt
1d1e0 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  e;.    }.#endif.
1d1f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d200 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
1d210 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
1d220 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1d230 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
1d240 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1d250 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
1d260 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1d270 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
1d280 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
1d290 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
1d2a0 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
1d2b0 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69  osFstat(((unixFi
1d2c0 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
1d2d0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1d2e0 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1d2f0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1d300 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1d310 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65  (unixFile*)id, e
1d320 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  rrno);.    retur
1d330 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1d340 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
1d350 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
1d360 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
1d370 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
1d380 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
1d390 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70  indInodeInfo() p
1d3a0 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72  rocedure.  ** wr
1d3b0 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79  ites a single by
1d3c0 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c  te into that fil
1d3d0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  e in order to wo
1d3e0 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a  rk around a bug.
1d3f0 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58    ** in the OS-X
1d400 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
1d410 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  m.  In order to 
1d420 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77  avoid problems w
1d430 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c  ith upper.  ** l
1d440 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74  ayers, we need t
1d450 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69  o report this fi
1d460 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20  le size as zero 
1d470 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
1d480 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e  s.  ** really 1.
1d490 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e     Ticket #3260.
1d4a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69  .  */.  if( *pSi
1d4b0 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d  ze==1 ) *pSize =
1d4c0 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53   0;...  return S
1d4d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1d4e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1d4f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1d500 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1d510 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72  _)./*.** Handler
1d520 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69   for proxy-locki
1d530 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ng file-control 
1d540 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20  verbs.  Defined 
1d550 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20  below in the.** 
1d560 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
1d570 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74   division..*/.st
1d580 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
1d590 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1d5a0 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64  3_file*,int,void
1d5b0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a  *);.#endif../* .
1d5c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d5d0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61   is called to ha
1d5e0 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f  ndle the SQLITE_
1d5f0 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
1d600 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  .** file-control
1d610 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c   operation.  Enl
1d620 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73  arge the databas
1d630 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73  e to nBytes in s
1d640 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20  ize.** (rounded 
1d650 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  up to the next c
1d660 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20  hunk-size).  If 
1d670 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1d680 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65  already.** nByte
1d690 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69  s or larger, thi
1d6a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1d6b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1d6c0 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  int fcntlSizeHin
1d6d0 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
1d6e0 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  e, i64 nByte){. 
1d6f0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1d700 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34  unk>0 ){.    i64
1d710 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
1d720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d730 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1d740 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
1d750 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20  tat buf;        
1d760 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1d770 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c   hold return val
1d780 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a  ues of fstat() *
1d790 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73  /.   .    if( os
1d7a0 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
1d7b0 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72  &buf) ){.      r
1d7c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1d7d0 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
1d7e0 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e  .    nSize = ((n
1d7f0 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68  Byte+pFile->szCh
1d800 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e  unk-1) / pFile->
1d810 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1d820 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69  ->szChunk;.    i
1d830 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75  f( nSize>(i64)bu
1d840 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69  f.st_size ){..#i
1d850 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
1d860 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
1d870 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
1d880 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a  LLOCATE.      /*
1d890 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20   The code below 
1d8a0 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20  is handling the 
1d8b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
1d8c0 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20  osFallocate() . 
1d8d0 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c       ** correctl
1d8e0 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  y. posix_falloca
1d8f0 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  te() is defined 
1d900 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f  to "returns zero
1d910 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20   on success, .  
1d920 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72      ** or an err
1d930 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61  or number on  fa
1d940 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20  ilure". See the 
1d950 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61  manpage for deta
1d960 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ils. */.      in
1d970 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b  t err;.      do{
1d980 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f  .        err = o
1d990 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65  sFallocate(pFile
1d9a0 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65  ->h, buf.st_size
1d9b0 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73  , nSize-buf.st_s
1d9c0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ize);.      }whi
1d9d0 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29  le( err==EINTR )
1d9e0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20  ;.      if( err 
1d9f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1da00 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c  IOERR_WRITE;.#el
1da10 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  se.      /* If t
1da20 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68  he OS does not h
1da30 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ave posix_falloc
1da40 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20  ate(), fake it. 
1da50 57 72 69 74 65 20 61 20 0a 20 20 20 20 20 20 2a  Write a .      *
1da60 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  * single byte to
1da70 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 69   the last byte i
1da80 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68 61  n each block tha
1da90 74 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79  t falls entirely
1daa0 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69 6e  .      ** within
1dab0 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1dac0 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72  gion. Then, if r
1dad0 65 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67 6c  equired, a singl
1dae0 65 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a 20  e byte.      ** 
1daf0 61 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a 65  at offset (nSize
1db00 2d 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65 20  -1), to set the 
1db10 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1db20 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20   correctly..    
1db30 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73    ** This is a s
1db40 69 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75 65  imilar technique
1db50 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62 79   to that used by
1db60 20 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65 6d   glibc on system
1db70 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
1db80 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  do not have a re
1db90 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 63  al fallocate() c
1dba0 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  all..      */.  
1dbb0 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62      int nBlk = b
1dbc0 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20  uf.st_blksize;  
1dbd0 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62  /* File-system b
1dbe0 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20  lock size */.   
1dbf0 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20     int nWrite = 
1dc00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1dc10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1dc20 73 20 77 72 69 74 74 65 6e 20 62 79 20 73 65 65  s written by see
1dc30 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
1dc40 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20     i64 iWrite;  
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dc60 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f  * Next offset to
1dc70 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20   write to */..  
1dc80 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62      iWrite = ((b
1dc90 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e  uf.st_size + 2*n
1dca0 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e  Blk - 1)/nBlk)*n
1dcb0 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 61 73 73  Blk-1;.      ass
1dcc0 65 72 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66  ert( iWrite>=buf
1dcd0 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20  .st_size );.    
1dce0 20 20 61 73 73 65 72 74 28 20 28 69 57 72 69 74    assert( (iWrit
1dcf0 65 2f 6e 42 6c 6b 29 3d 3d 28 28 62 75 66 2e 73  e/nBlk)==((buf.s
1dd00 74 5f 73 69 7a 65 2b 6e 42 6c 6b 2d 31 29 2f 6e  t_size+nBlk-1)/n
1dd10 42 6c 6b 29 20 29 3b 0a 20 20 20 20 20 20 61 73  Blk) );.      as
1dd20 73 65 72 74 28 20 28 28 69 57 72 69 74 65 2b 31  sert( ((iWrite+1
1dd30 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20  )%nBlk)==0 );.  
1dd40 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a      for(/*no-op*
1dd50 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 3b  /; iWrite<nSize;
1dd60 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b   iWrite+=nBlk ){
1dd70 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20  .        nWrite 
1dd80 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
1dd90 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22  File, iWrite, ""
1dda0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1ddb0 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65  ( nWrite!=1 ) re
1ddc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1ddd0 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d  R_WRITE;.      }
1dde0 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74  .      if( nWrit
1ddf0 65 3d 3d 30 20 7c 7c 20 28 6e 53 69 7a 65 25 6e  e==0 || (nSize%n
1de00 42 6c 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Blk) ){.        
1de10 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64  nWrite = seekAnd
1de20 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6e 53 69  Write(pFile, nSi
1de30 7a 65 2d 31 2c 20 22 22 2c 20 31 29 3b 0a 20 20  ze-1, "", 1);.  
1de40 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
1de50 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
1de60 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1de70 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1de80 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53      }.  }..#if S
1de90 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1dea0 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c  IZE>0.  if( pFil
1deb0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  e->mmapSizeMax>0
1dec0 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d   && nByte>pFile-
1ded0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1dee0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28   int rc;.    if(
1def0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c   pFile->szChunk<
1df00 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1df10 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1df20 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
1df30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
1df40 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1df50 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
1df60 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1df70 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1df80 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1df90 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1dfa0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1dfb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
1dfc0 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
1dfd0 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ile, nByte);.   
1dfe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1dff0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1e000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1e010 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1e020 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74   initially negat
1e030 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
1e040 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
1e050 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
1e060 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
1e070 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
1e080 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
1e090 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
1e0a0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
1e0b0 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
1e0c0 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
1e0d0 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
1e0e0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
1e0f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e100 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78  unixModeBit(unix
1e110 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
1e120 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
1e130 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
1e140 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
1e150 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
1e160 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
1e170 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
1e180 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
1e190 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1e1a0 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
1e1b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1e1c0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1e1d0 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
1e1e0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1e1f0 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
1e200 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
1e210 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
1e220 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a  ar *zBuf);../*.*
1e230 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
1e240 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
1e250 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
1e260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e270 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
1e280 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1e290 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1e2a0 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c  pArg){.  unixFil
1e2b0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1e2c0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
1e2d0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1e2e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e2f0 57 41 4c 5f 42 4c 4f 43 4b 3a 20 7b 0a 20 20 20  WAL_BLOCK: {.   
1e300 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 63 74 72     /* pFile->ctr
1e310 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
1e320 4c 45 5f 42 4c 4f 43 4b 3b 20 2f 2f 20 44 65 66  LE_BLOCK; // Def
1e330 65 72 72 65 64 20 66 65 61 74 75 72 65 20 2a 2f  erred feature */
1e340 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e350 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1e360 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e370 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1e380 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1e390 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69  Arg = pFile->eFi
1e3a0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1e3b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e3c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1e3d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54  QLITE_FCNTL_LAST
1e3e0 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
1e3f0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1e400 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
1e410 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e420 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e430 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e440 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
1e450 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1e460 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
1e470 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
1e480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e490 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e4a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1e4b0 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  HINT: {.      in
1e4c0 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75  t rc;.      Simu
1e4d0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1e4e0 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
1e4f0 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70   fcntlSizeHint(p
1e500 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41  File, *(i64 *)pA
1e510 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  rg);.      Simul
1e520 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1e530 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (0);.      retur
1e540 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1e550 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e560 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
1e570 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42  .      unixModeB
1e580 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49  it(pFile, UNIXFI
1e590 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
1e5a0 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1e5b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e5c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e5d0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e5e0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1e5f0 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  RITE: {.      un
1e600 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1e610 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20   UNIXFILE_PSOW, 
1e620 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1e630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e640 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e650 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e660 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  _VFSNAME: {.    
1e670 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1e680 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1e690 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70  f("%s", pFile->p
1e6a0 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Vfs->zName);.   
1e6b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e6c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e6d0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e6e0 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b  _TEMPFILENAME: {
1e6f0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46  .      char *zTF
1e700 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
1e710 6c 6c 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70  lloc64( pFile->p
1e720 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
1e730 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46  );.      if( zTF
1e740 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ile ){.        u
1e750 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  nixGetTempname(p
1e760 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  File->pVfs->mxPa
1e770 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b  thname, zTFile);
1e780 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
1e790 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b  *)pArg = zTFile;
1e7a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1e7b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e7c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e7d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53  SQLITE_FCNTL_HAS
1e7e0 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20  _MOVED: {.      
1e7f0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69  *(int*)pArg = fi
1e800 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65  leHasMoved(pFile
1e810 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e830 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1e840 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20  MMAP_SIZE>0.    
1e850 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e860 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  L_MMAP_SIZE: {. 
1e870 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69       i64 newLimi
1e880 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b  t = *(i64*)pArg;
1e890 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1e8a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1e8b0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71   if( newLimit>sq
1e8c0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e8d0 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20  g.mxMmap ){.    
1e8e0 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73      newLimit = s
1e8f0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e900 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20  ig.mxMmap;.     
1e910 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29   }.      *(i64*)
1e920 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  pArg = pFile->mm
1e930 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20  apSizeMax;.     
1e940 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
1e950 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46   && newLimit!=pF
1e960 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1e970 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63   && pFile->nFetc
1e980 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  hOut==0 ){.     
1e990 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1e9a0 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74  zeMax = newLimit
1e9b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
1e9c0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20  ile->mmapSize>0 
1e9d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  ){.          uni
1e9e0 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  xUnmapfile(pFile
1e9f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1ea00 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
1ea10 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ile, -1);.      
1ea20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ea30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ea40 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
1ea50 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1ea60 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
1ea70 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64  alls this method
1ea80 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20   to signal that 
1ea90 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20  it has done.    
1eaa0 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ** a rollback an
1eab0 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
1eac0 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65  ase is therefore
1ead0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20   unchanged and. 
1eae0 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69     ** it hence i
1eaf0 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1eb00 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e  transaction chan
1eb10 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65  ge counter to be
1eb20 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65  .    ** unchange
1eb30 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
1eb40 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1eb50 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a  DB_UNCHANGED: {.
1eb60 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
1eb70 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20  *)id)->dbUpdate 
1eb80 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1eb90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1eba0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   }.#endif.#if SQ
1ebb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1ebc0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1ebd0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1ebe0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ebf0 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52  FCNTL_SET_LOCKPR
1ec00 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73  OXYFILE:.    cas
1ec10 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47  e SQLITE_FCNTL_G
1ec20 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1ec30 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
1ec40 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1ec50 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20  l(id,op,pArg);. 
1ec60 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1ec70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1ec80 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1ec90 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1eca0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
1ecb0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
1ecc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ecd0 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
1ece0 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
1ecf0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
1ed00 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
1ed10 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1ed20 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
1ed30 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
1ed40 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
1ed50 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
1ed60 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
1ed70 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
1ed80 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
1ed90 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
1eda0 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
1edb0 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
1edc0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
1edd0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
1ede0 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
1edf0 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
1ee00 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
1ee10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
1ee20 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
1ee30 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
1ee40 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
1ee50 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51  ..*/.#ifndef __Q
1ee60 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20  NXNTO__ .static 
1ee70 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
1ee80 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1ee90 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
1eea0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1eeb0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
1eec0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1eed0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23  SECTOR_SIZE;.}.#
1eee0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1eef0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69   following versi
1ef00 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72  on of unixSector
1ef10 53 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69  Size() is optimi
1ef20 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a  zed for QNX..*/.
1ef30 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
1ef40 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  _.#include <sys/
1ef50 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63  dcmd_blk.h>.#inc
1ef60 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66  lude <sys/statvf
1ef70 73 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20  s.h>.static int 
1ef80 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
1ef90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
1efa0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1efb0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1efc0 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
1efd0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20  ->sectorSize == 
1efe0 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
1eff0 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a  statvfs fsInfo;.
1f000 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53         .    /* S
1f010 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20  et defaults for 
1f020 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69  non-supported fi
1f030 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20  lesystems */.   
1f040 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f050 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
1f060 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1f070 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69  .    pFile->devi
1f080 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f090 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66  s = 0;.    if( f
1f0a0 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68  statvfs(pFile->h
1f0b0 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
1f0c0 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72   ) {.      retur
1f0d0 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  n pFile->sectorS
1f0e0 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
1f0f0 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1f100 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1f110 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20  tmp") ) {.      
1f120 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1f130 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1f140 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1f150 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1f160 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1f170 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1f180 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f  OMIC4K |       /
1f190 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79  * All ram filesy
1f1a0 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
1f1b0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1f1c0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1f1d0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1f1e0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1f1f0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1f200 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f230 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1f240 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1f250 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1f260 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1f270 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1f280 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1f290 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f2c0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1f2d0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1f2e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1f2f0 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rstr(fsInfo.f_ba
1f300 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20  setype, "etfs") 
1f310 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1f320 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1f330 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1f340 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1f350 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f360 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66  =.        /* etf
1f370 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77  s cluster size w
1f380 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
1f390 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69   */.        (pFi
1f3a0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
1f3b0 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
1f3c0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c  CAP_ATOMIC512) |
1f3d0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f3e0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1f3f0 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
1f400 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
1f410 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
1f450 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
1f460 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f470 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
1f480 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
1f490 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
1f4a0 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
1f4e0 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
1f4f0 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
1f500 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
1f510 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1f520 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20  "qnx6") ){.     
1f530 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f540 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1f550 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1f560 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1f570 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1f580 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
1f590 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20  TOMIC |         
1f5a0 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65  /* All filesyste
1f5b0 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
1f5c0 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
1f5d0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1f5e0 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
1f5f0 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
1f600 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1f610 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f630 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1f640 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
1f650 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
1f660 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1f670 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1f680 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1f690 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1f6a0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1f6d0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1f6e0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1f6f0 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63   }else if( !strc
1f700 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
1f710 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b  type, "qnx4") ){
1f720 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
1f730 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
1f740 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
1f750 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1f760 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
1f770 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
1f780 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
1f790 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
1f7a0 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
1f7b0 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
1f7c0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1f7d0 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
1f7e0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
1f7f0 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
1f800 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f810 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1f820 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1f830 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1f840 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1f880 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1f890 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1f8a0 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66  if( strstr(fsInf
1f8b0 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64  o.f_basetype, "d
1f8c0 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  os") ){.      pF
1f8d0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f8e0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1f8f0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1f900 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f910 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
1f920 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66  * full bitset of
1f930 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61   atomics from ma
1f940 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e  x sector size an
1f950 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  d smaller */.   
1f960 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65       ((pFile->se
1f970 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
1f980 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1f990 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d  OMIC512) << 1) -
1f9a0 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c   2 |.        SQL
1f9b0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1f9c0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1f9d0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1f9e0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1f9f0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1fa20 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1fa30 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1fa40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
1fa50 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1fa60 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1fa70 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1fa80 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20  P_ATOMIC512 |   
1fa90 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65     /* blocks are
1faa0 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1fab0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fac0 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1fad0 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1fae0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1faf0 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1fb30 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1fb40 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1fb50 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76  /* Last chance v
1fb60 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66  erification.  If
1fb70 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1fb80 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c   isn't a multipl
1fb90 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68  e of 512.  ** th
1fba0 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69  en it isn't vali
1fbb0 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  d.*/.  if( pFile
1fbc0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35  ->sectorSize % 5
1fbd0 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70  12 != 0 ){.    p
1fbe0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1fbf0 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b  acteristics = 0;
1fc00 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
1fc10 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
1fc20 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1fc30 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IZE;.  }.  retur
1fc40 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  n pFile->sectorS
1fc50 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ize;.}.#endif /*
1fc60 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a   __QNXNTO__ */..
1fc70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1fc80 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1fc90 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
1fca0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
1fcb0 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74   VFS is set up t
1fcc0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
1fcd0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1fce0 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66  OVERWRITE by def
1fcf0 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ault..** However
1fd00 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73  , that choice is
1fd10 20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73   controversial s
1fd20 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79  ince technically
1fd30 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1fd40 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64  ** file system d
1fd50 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70  oes not always p
1fd60 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65  rovide powersafe
1fd70 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49   overwrites.  (I
1fd80 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
1fd90 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d  , after a power-
1fda0 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74  loss event, part
1fdb0 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68  s of the file th
1fdc0 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a  at were never.**
1fdd0 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65   written might e
1fde0 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65  nd up being alte
1fdf0 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20  red.)  However, 
1fe00 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f  non-PSOW behavio
1fe10 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65  r is very,.** ve
1fe20 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73  ry rare.  And as
1fe30 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b  serting PSOW mak
1fe40 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63  es a large reduc
1fe50 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75  tion in the amou
1fe60 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65  nt.** of require
1fe70 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61  d I/O for journa
1fe80 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f  ling, since a lo
1fe90 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  t of padding is 
1fea0 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20  eliminated..**  
1feb0 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57  Hence, while POW
1fec0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1fed0 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
1fee0 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69  t, there is a fi
1fef0 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76  le-control.** av
1ff00 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
1ff10 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71  it off and URI q
1ff20 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61  uery parameter a
1ff30 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
1ff40 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74   it off..*/.stat
1ff50 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63  ic int unixDevic
1ff60 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1ff70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1ff80 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
1ff90 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  p = (unixFile*)i
1ffa0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
1ffb0 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
1ffc0 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74  __.  if( p->sect
1ffd0 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78  orSize==0 ) unix
1ffe0 53 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a  SectorSize(id);.
1fff0 20 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65    rc = p->device
20000 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
20010 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
20020 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
20030 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20  XFILE_PSOW ){.  
20040 20 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49    rc |= SQLITE_I
20050 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
20060 56 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20  VERWRITE;.  }.  
20070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
20080 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
20090 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
200a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
200b0 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  IZE>0../*.** Ret
200c0 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70  urn the system p
200d0 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
200e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
200f0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
20100 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f  ed directly by o
20110 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69  ther code in thi
20120 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74  s file. .** Inst
20130 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62  ead, it should b
20140 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63  e called via mac
20150 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ro osGetpagesize
20160 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
20170 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a  t unixGetpagesiz
20180 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f  e(void){.#if OS_
20190 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
201a0 20 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66   1024;.#elif def
201b0 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45  ined(_BSD_SOURCE
201c0 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61  ).  return getpa
201d0 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a  gesize();.#else.
201e0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79    return (int)sy
201f0 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49  sconf(_SC_PAGESI
20200 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  ZE);.#endif.}..#
20210 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
20220 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
20230 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
20240 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
20250 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20260 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20  OMIT_WAL../*.** 
20270 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
20280 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72  epresent an shar
20290 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
202a0 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d  .  .**.** When m
202b0 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
202c0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
202d0 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78  e same wal-index
202e0 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a  , each thread.**
202f0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69   has its own uni
20300 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74  xShm object, but
20310 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
20320 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
20330 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ance.** of this 
20340 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20350 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
20360 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e  rds, each wal-in
20370 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  dex is opened.**
20380 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
20390 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  rocess..**.** Ea
203a0 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ch unixShmNode o
203b0 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74  bject is connect
203c0 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75  ed to a single u
203d0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
203e0 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  ect..** We could
203f0 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f   coalesce this o
20400 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49  bject into unixI
20410 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68  nodeInfo, but th
20420 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a  at would mean.**
20430 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65   every open file
20440 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
20450 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  se shared memory
20460 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
20470 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66  , most.** open f
20480 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65  iles) would have
20490 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64   to carry around
204a0 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f   this extra info
204b0 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  rmation.  So.** 
204c0 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
204d0 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
204e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
204f0 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
20500 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68  object.** and th
20510 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
20520 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
20530 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64  only when needed
20540 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65  ..**.** unixMute
20550 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
20560 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
20570 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
20580 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
20590 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
205a0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
205b0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
205c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
205d0 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  f.**.** The foll
205e0 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
205f0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
20600 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
20610 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
20620 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
20630 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
20640 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
20650 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
20660 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d   held or unixShm
20670 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
20680 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
20690 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
206a0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
206b0 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
206c0 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
206d0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
206e0 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
206f0 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
20700 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f  o *pInode;     /
20710 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  * unixInodeInfo 
20720 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53  that owns this S
20730 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  HM node */.  sql
20740 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
20750 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
20760 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
20770 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
20780 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
20790 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
207a0 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
207b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
207c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207d0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
207e0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
207f0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
20800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
20810 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
20820 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
20830 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20   u16 nRegion;   
20840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20850 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
20860 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
20870 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
20880 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20890 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
208a0 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
208b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
208c0 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
208d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
208e0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
208f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
20900 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20910 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
20920 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
20930 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
20940 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
20950 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
20960 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
20970 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
20980 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20990 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
209b0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
209c0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
209d0 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
209e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
209f0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
20a00 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
20a10 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
20a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
20a30 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
20a40 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
20a50 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
20a60 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
20a70 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
20a80 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
20a90 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
20aa0 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
20ab0 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
20ac0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
20ad0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
20ae0 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
20af0 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
20b00 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
20b10 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
20b20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
20b30 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69  *    unixShm.pFi
20b40 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  le.**    unixShm
20b50 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
20b60 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
20b70 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
20b80 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d  unixShm.pFile->m
20b90 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
20ba0 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
20bb0 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
20bc0 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
20bd0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a  truct unixShm {.
20be0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
20bf0 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  ShmNode;     /* 
20c00 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75  The underlying u
20c10 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20c20 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  t */.  unixShm *
20c30 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
20c40 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68    /* Next unixSh
20c50 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
20c60 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
20c70 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
20c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20c90 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
20ca0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d  he unixShmNode m
20cb0 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b  utex */.  u8 id;
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
20ce0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
20cf0 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d  thin its unixShm
20d00 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68  Node */.  u16 sh
20d10 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
20d20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
20d30 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
20d40 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
20d50 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
20d60 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
20d70 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
20d80 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  d */.};../*.** C
20d90 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
20da0 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
20db0 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41  fine UNIX_SHM_BA
20dc0 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
20dd0 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
20de0 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
20df0 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
20e00 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  fine UNIX_SHM_DM
20e10 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42  S    (UNIX_SHM_B
20e20 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
20e30 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
20e40 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
20e50 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61  ** Apply posix a
20e60 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
20e70 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d  r all bytes from
20e80 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66   ofst through of
20e90 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  st+n-1..**.** Lo
20ea0 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65  cks block if the
20eb0 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79   mask is exactly
20ec0 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20   UNIX_SHM_C and 
20ed0 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  are non-blocking
20ee0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
20ef0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20f00 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  xShmSystemLock(.
20f10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
20f20 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  e,       /* Open
20f30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
20f40 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20  he WAL file */. 
20f50 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
20f60 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c          /* F_UNL
20f70 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20  CK, F_RDLCK, or 
20f80 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  F_WRLCK */.  int
20f90 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
20fa0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
20fb0 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e of the locking
20fc0 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20   range */.  int 
20fd0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
20fe0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20ff0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
21000 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  .){.  unixShmNod
21010 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
21020 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
21030 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
21040 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
21050 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  /.  struct flock
21060 20 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68   f;        /* Th
21070 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
21080 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
21090 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
210a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f   SQLITE_OK;    /
210b0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
210c0 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20  rm fcntl() */.. 
210d0 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
210e0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
210f0 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
21100 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
21110 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d   */.  pShmNode =
21120 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
21130 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65  pShmNode;.  asse
21140 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
21150 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d  x_held(pShmNode-
21160 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e  >mutex) || pShmN
21170 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ode->nRef==0 );.
21180 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63  .  /* Shared loc
21190 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f  ks never span mo
211a0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65  re than one byte
211b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   */.  assert( n=
211c0 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d  =1 || lockType!=
211d0 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a  F_RDLCK );..  /*
211e0 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69   Locks are withi
211f0 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73  n range */.  ass
21200 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53  ert( n>=1 && n<S
21210 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
21220 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
21230 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
21240 69 6e 74 20 6c 6b 54 79 70 65 3b 0a 20 20 20 20  int lkType;.    
21250 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
21260 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
21270 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  ters */.    mems
21280 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&f, 0, sizeof
21290 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79  (f));.    f.l_ty
212a0 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20  pe = lockType;. 
212b0 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20     f.l_whence = 
212c0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e  SEEK_SET;.    f.
212d0 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a  l_start = ofst;.
212e0 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b      f.l_len = n;
212f0 0a 0a 20 20 20 20 6c 6b 54 79 70 65 20 3d 20 28  ..    lkType = (
21300 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
21310 20 26 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f 43   & UNIXFILE_BLOC
21320 4b 29 21 3d 30 20 3f 20 46 5f 53 45 54 4c 4b 57  K)!=0 ? F_SETLKW
21330 20 3a 20 46 5f 53 45 54 4c 4b 3b 0a 20 20 20 20   : F_SETLK;.    
21340 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68  rc = osFcntl(pSh
21350 6d 4e 6f 64 65 2d 3e 68 2c 20 6c 6b 54 79 70 65  mNode->h, lkType
21360 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  , &f);.    rc = 
21370 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c  (rc!=(-1)) ? SQL
21380 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
21390 42 55 53 59 3b 0a 20 20 20 20 70 46 69 6c 65 2d  BUSY;.    pFile-
213a0 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55  >ctrlFlags &= ~U
213b0 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b 3b 0a 20  NIXFILE_BLOCK;. 
213c0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
213d0 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20  the global lock 
213e0 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62  state and do deb
213f0 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  ug tracing */.#i
21400 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
21410 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a  G.  { u16 mask;.
21420 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
21430 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b  LOCK "));.  mask
21440 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30 78 66   = ofst>31 ? 0xf
21450 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b  fff : (1<<(ofst+
21460 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
21470 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
21490 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
214a0 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
214b0 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f  CE(("unlock %d o
214c0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
214d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
214e0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
214f0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
21500 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
21510 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  sk;.    }else if
21520 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44  ( lockType==F_RD
21530 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
21540 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b  RACE(("read-lock
21550 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
21560 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21570 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
21580 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
21590 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c  de->sharedMask |
215a0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73  = mask;.    }els
215b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
215c0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
215d0 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
215e0 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
215f0 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
21600 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21610 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
21620 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
21630 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
21640 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20   ~mask;.    }.  
21650 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c  }else{.    if( l
21660 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
21670 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
21680 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61  E(("unlock %d fa
21690 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
216a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
216b0 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
216c0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
216d0 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c  ("read-lock fail
216e0 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ed"));.    }else
216f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21700 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
21710 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
21720 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
21730 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74  %d failed", ofst
21740 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
21750 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74  OSTRACE((" - aft
21760 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33  erwards %03x,%03
21770 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
21780 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
21790 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d  dMask, pShmNode-
217a0 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d  >exclMask));.  }
217b0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
217c0 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a  n rc;        .}.
217d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
217e0 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  e minimum number
217f0 20 6f 66 20 33 32 4b 42 20 73 68 6d 20 72 65 67   of 32KB shm reg
21800 69 6f 6e 73 20 74 68 61 74 20 73 68 6f 75 6c 64  ions that should
21810 20 62 65 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a   be mapped at.**
21820 20 61 20 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e   a time, assumin
21830 67 20 74 68 61 74 20 65 61 63 68 20 6d 61 70 70  g that each mapp
21840 69 6e 67 20 6d 75 73 74 20 62 65 20 61 6e 20 69  ing must be an i
21850 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
21860 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
21870 74 20 73 79 73 74 65 6d 20 70 61 67 65 2d 73 69  t system page-si
21880 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c  ze..**.** Usuall
21890 79 2c 20 74 68 69 73 20 69 73 20 31 2e 20 54 68  y, this is 1. Th
218a0 65 20 65 78 63 65 70 74 69 6f 6e 20 73 65 65 6d  e exception seem
218b0 73 20 74 6f 20 62 65 20 73 79 73 74 65 6d 73 20  s to be systems 
218c0 74 68 61 74 20 61 72 65 20 63 6f 6e 66 69 67 75  that are configu
218d0 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34  red.** to use 64
218e0 4b 42 20 70 61 67 65 73 20 2d 20 69 6e 20 74 68  KB pages - in th
218f0 69 73 20 63 61 73 65 20 65 61 63 68 20 6d 61 70  is case each map
21900 70 69 6e 67 20 6d 75 73 74 20 63 6f 76 65 72 20  ping must cover 
21910 61 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20  at least two.** 
21920 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a  shm regions..*/.
21930 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
21940 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 76  hmRegionPerMap(v
21950 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73  oid){.  int shms
21960 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20 20 20 20  z = 32*1024;    
21970 20 20 20 20 20 20 20 20 2f 2a 20 53 48 4d 20 72          /* SHM r
21980 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20  egion size */.  
21990 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47 65 74  int pgsz = osGet
219a0 70 61 67 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a  pagesize();   /*
219b0 20 53 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a   System page siz
219c0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  e */.  assert( (
219d0 28 70 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d  (pgsz-1)&pgsz)==
219e0 30 20 29 3b 20 20 20 2f 2a 20 50 61 67 65 20 73  0 );   /* Page s
219f0 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
21a00 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66  wer of 2 */.  if
21a10 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72  ( pgsz<shmsz ) r
21a20 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
21a30 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a  n pgsz/shmsz;.}.
21a40 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
21a50 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74   unixShmNodeList
21a60 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
21a70 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68  ries with unixSh
21a80 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
21a90 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
21aa0 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
21ab0 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
21ac0 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
21ad0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
21ae0 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
21af0 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
21b00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
21b10 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69  xShmPurge(unixFi
21b20 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78  le *pFd){.  unix
21b30 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64  ShmNode *p = pFd
21b40 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
21b50 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
21b60 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
21b70 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e  .  if( p && p->n
21b80 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Ref==0 ){.    in
21b90 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75  t nShmPerMap = u
21ba0 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
21bb0 61 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b  ap();.    int i;
21bc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
21bd0 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e  pInode==pFd->pIn
21be0 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ode );.    sqlit
21bf0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
21c00 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
21c10 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
21c20 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61  on; i+=nShmPerMa
21c30 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  p){.      if( p-
21c40 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
21c50 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52   osMunmap(p->apR
21c60 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52  egion[i], p->szR
21c70 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65  egion);.      }e
21c80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
21c90 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
21ca0 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  egion[i]);.     
21cb0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
21cc0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
21cd0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20  egion);.    if( 
21ce0 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  p->h>=0 ){.     
21cf0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
21d00 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  d, p->h, __LINE_
21d10 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d  _);.      p->h =
21d20 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
21d30 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
21d40 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  de = 0;.    sqli
21d50 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
21d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
21d70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
21d80 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  rea associated w
21d90 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73  ith open databas
21da0 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a  e file pDbFd.  .
21db0 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  ** This particul
21dc0 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ar implementatio
21dd0 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66  n uses mmapped f
21de0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
21df0 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70  file used to imp
21e00 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65  lement shared-me
21e10 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73  mory is in the s
21e20 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ame directory.**
21e30 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
21e40 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68  abase file and h
21e50 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
21e60 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
21e70 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69  abase.** file wi
21e80 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75  th the "-shm" su
21e90 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72  ffix added.  For
21ea0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
21eb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
21ec0 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72  * is "/home/user
21ed0 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65  1/config.db" the
21ee0 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  n the file that 
21ef0 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d  is created and m
21f00 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68  mapped.** for sh
21f10 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  ared memory will
21f20 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d   be called "/hom
21f30 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
21f40 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  b-shm".  .**.** 
21f50 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68  Another approach
21f60 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69   to is to use fi
21f70 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20  les in /dev/shm 
21f80 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61  or /dev/tmp or a
21f90 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20  n.** some other 
21fa0 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74  tmpfs mount. But
21fb0 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20   if a file in a 
21fc0 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74  different direct
21fd0 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ory.** from the 
21fe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
21ff0 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66   used, then diff
22000 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72  ering access per
22010 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61  missions.** or a
22020 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20   chroot() might 
22030 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72  cause two differ
22040 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e  ent processes on
22050 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74   the same.** dat
22060 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20  abase to end up 
22070 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20  using different 
22080 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64  files for shared
22090 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65   memory - .** me
220a0 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72  aning that their
220b0 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f   memory would no
220c0 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72  t really be shar
220d0 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a  ed - resulting.*
220e0 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  * in database co
220f0 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72  rruption.  Never
22100 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d  theless, this tm
22110 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a  pfs file usage.*
22120 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64  * can be enabled
22130 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
22140 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
22150 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f  SHM_DIRECTORY="/
22160 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74  dev/shm".** or t
22170 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  he equivalent.  
22180 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53  The use of the S
22190 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
221a0 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
221b0 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c  .** option resul
221c0 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  ts in an incompa
221d0 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  tible build of S
221e0 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f  QLite;  builds o
221f0 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74  f SQLite.** that
22200 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20   with differing 
22210 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
22220 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74  TORY settings at
22230 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65  tempt to use the
22240 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73  .** same databas
22250 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
22260 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73  me time, databas
22270 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c  e corruption wil
22280 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
22290 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53  lt. The SQLITE_S
222a0 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
222b0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
222c0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a   is considered.*
222d0 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20  * "unsupported" 
222e0 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20  and may go away 
222f0 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69  in a future SQLi
22300 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a  te release..**.*
22310 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
22320 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
22330 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
22340 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
22350 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
22360 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
22370 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
22380 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
22390 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
223a0 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
223b0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
223c0 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
223d0 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
223e0 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leared..**.** If
223f0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
22400 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62  tabase file (pDb
22410 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65  Fd) is using the
22420 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53   "unix-excl" VFS
22430 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74  .** that means t
22440 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  hat an exclusive
22450 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
22460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22470 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e  le and.** that n
22480 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
22490 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65  s are able to re
224a0 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
224b0 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a  database.  In.**
224c0 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64   that case, we d
224d0 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65  o not really nee
224e0 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  d shared memory.
224f0 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f    No shared memo
22500 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72  ry.** file is cr
22510 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72  eated.  The shar
22520 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ed memory will b
22530 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68  e simulated with
22540 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   heap memory..*/
22550 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
22560 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
22570 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64  (unixFile *pDbFd
22580 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
22590 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  Shm *p = 0;     
225a0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
225b0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
225c0 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
225d0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
225e0 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20  mNode;   /* The 
225f0 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
22600 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
22610 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22630 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
22640 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
22650 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
22660 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66   /* The inode of
22670 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
22680 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
22690 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
226a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65   of the file use
226b0 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69  d for SHM */.  i
226c0 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  nt nShmFilename;
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
226e0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48  * Size of the SH
226f0 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79  M filename in by
22700 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  tes */..  /* All
22710 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
22720 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20  the new unixShm 
22730 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d  object. */.  p =
22740 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
22750 34 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  4( sizeof(*p) );
22760 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
22770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22780 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  M;.  memset(p, 0
22790 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
227a0 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
227b0 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pShm==0 );..  /*
227c0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
227d0 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f   a unixShmNode o
227e0 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78  bject already ex
227f0 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65  ists. Reuse an e
22800 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65  xisting.  ** one
22810 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65   if present. Cre
22820 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
22830 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
22840 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
22850 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
22860 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
22870 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f   pShmNode = pIno
22880 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
22890 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
228a0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
228b0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
228c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74            /* fst
228d0 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61  at() info for da
228e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
228f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 48  ifndef SQLITE_SH
22900 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
22910 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73  const char *zBas
22920 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a  ePath = pDbFd->z
22930 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Path;.#endif..  
22940 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28    /* Call fstat(
22950 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
22960 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
22970 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22980 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20  file. If.    ** 
22990 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65  a new *-shm file
229a0 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20   is created, an 
229b0 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20  attempt will be 
229c0 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69  made to create i
229d0 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  t.    ** with th
229e0 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
229f0 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ns..    */.    i
22a00 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64  f( osFstat(pDbFd
22a10 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26 20  ->h, &sStat) && 
22a20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
22a30 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
22a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
22a50 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20  RR_FSTAT;.      
22a60 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22a70 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  r;.    }..#ifdef
22a80 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22a90 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69  CTORY.    nShmFi
22aa0 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28  lename = sizeof(
22ab0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
22ac0 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73  TORY) + 31;.#els
22ad0 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  e.    nShmFilena
22ae0 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74  me = 6 + (int)st
22af0 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b  rlen(zBasePath);
22b00 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
22b10 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Node = sqlite3_m
22b20 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
22b30 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68  *pShmNode) + nSh
22b40 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20  mFilename );.   
22b50 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
22b60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
22b70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22b80 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
22b90 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _err;.    }.    
22ba0 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c  memset(pShmNode,
22bb0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d   0, sizeof(*pShm
22bc0 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61  Node)+nShmFilena
22bd0 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c  me);.    zShmFil
22be0 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65  ename = pShmNode
22bf0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
22c00 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31  har*)&pShmNode[1
22c10 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
22c20 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
22c30 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22c40 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
22c50 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
22c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d        SQLITE_SHM
22c80 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c  _DIRECTORY "/sql
22c90 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a  ite-shm-%x-%x",.
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e       (u32)sStat.
22cc0 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74  st_ino, (u32)sSt
22cd0 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73  at.st_dev);.#els
22ce0 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  e.    sqlite3_sn
22cf0 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e  printf(nShmFilen
22d00 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ame, zShmFilenam
22d10 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61  e, "%s-shm", zBa
22d20 73 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  sePath);.    sql
22d30 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
22d40 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53  pDbFd->zPath, zS
22d50 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e  hmFilename);.#en
22d60 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
22d70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44  ->h = -1;.    pD
22d80 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
22d90 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
22da0 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
22db0 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
22dc0 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d  pInode;.    pShm
22dd0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
22de0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
22df0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
22e00 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
22e10 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
22e20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
22e30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22e40 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
22e50 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
22e60 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
22e70 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
22e80 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c        int openFl
22e90 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
22ea0 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66  _CREAT;.      if
22eb0 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
22ec0 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61  olean(pDbFd->zPa
22ed0 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68  th, "readonly_sh
22ee0 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  m", 0) ){.      
22ef0 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
22f00 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  RDONLY;.        
22f10 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
22f20 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  only = 1;.      
22f30 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
22f40 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65  ->h = robust_ope
22f50 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  n(zShmFilename, 
22f60 6f 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61  openFlags, (sSta
22f70 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29  t.st_mode&0777))
22f80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
22f90 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20  Node->h<0 ){.   
22fa0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
22fb0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
22fc0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
22fd0 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  en", zShmFilenam
22fe0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
22ff0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
23000 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
23010 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73   If this process
23020 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72   is running as r
23030 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oot, make sure t
23040 68 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65  hat the SHM file
23050 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e  .      ** is own
23060 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 75  ed by the same u
23070 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68  ser that owns th
23080 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
23090 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ase.  Otherwise,
230a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
230b0 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c  iginal owner wil
230c0 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  l not be able to
230d0 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20   connect..      
230e0 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46  */.      robustF
230f0 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e  chown(pShmNode->
23100 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c  h, sStat.st_uid,
23110 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a   sStat.st_gid);.
23120 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63    .      /* Chec
23130 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  k to see if anot
23140 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
23150 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d  olding the dead-
23160 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20  man switch..    
23170 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75    ** If not, tru
23180 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
23190 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a  o zero length. .
231a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
231b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
231c0 20 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d       if( unixShm
231d0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
231e0 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
231f0 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
23200 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23210 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
23220 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
23230 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
23240 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
23250 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23260 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72  RR_SHMOPEN, "ftr
23270 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c  uncate", zShmFil
23280 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
23290 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
232a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
232b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
232c0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
232d0 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c  ock(pDbFd, F_RDL
232e0 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
232f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
23300 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
23310 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
23320 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
23330 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
23340 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
23350 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  of the unixShmNo
23360 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
23370 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
23380 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
23390 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
233a0 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
233b0 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
233c0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
233d0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
233e0 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  p;.  unixLeaveMu
233f0 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
23400 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
23410 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
23420 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
23430 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
23440 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
23450 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  f the unixEnterM
23460 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
23470 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
23480 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
23490 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20  struct unixShm) 
234a0 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
234b0 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
234c0 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
234d0 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
234e0 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
234f0 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
23500 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
23510 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
23520 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
23530 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
23540 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
23550 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
23560 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74  >mutex .  ** mut
23570 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
23580 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
23590 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
235a0 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
235b0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
235c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
235d0 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
235e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
235f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
23600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23610 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
23620 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
23630 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
23640 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65  :.  unixShmPurge
23650 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f  (pDbFd);       /
23660 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
23670 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
23680 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
23690 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75  te3_free(p);.  u
236a0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
236b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
236c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
236d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
236e0 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
236f0 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
23700 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
23710 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
23720 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
23730 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
23740 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
23750 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
23760 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
23770 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
23780 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
23790 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
237a0 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
237b0 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
237c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
237d0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
237e0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
237f0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
23800 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
23810 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74  ise, if the bExt
23820 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  end parameter is
23830 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
23840 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
23850 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
23860 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
23870 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
23880 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
23890 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
238a0 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
238b0 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
238c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
238d0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
238e0 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74  ned. If .** bExt
238f0 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  end is non-zero 
23900 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
23910 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
23920 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
23930 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
23940 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
23950 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
23960 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
23970 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
23980 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
23990 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
239a0 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
239b0 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
239c0 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
239d0 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
239e0 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
239f0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
23a00 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
23a10 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
23a20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
23a30 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
23a40 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
23a50 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
23a60 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
23a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
23a80 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  xShmMap(.  sqlit
23a90 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
23aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
23ab0 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
23ac0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
23ad0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23af0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
23b00 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
23b10 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
23b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
23b30 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
23b40 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20  .  int bExtend, 
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b60 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
23b70 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
23b80 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
23b90 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23bb0 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
23bc0 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  y */.){.  unixFi
23bd0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
23be0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69  xFile*)fd;.  uni
23bf0 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53  xShm *p;.  unixS
23c00 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
23c10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23c20 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53  ITE_OK;.  int nS
23c30 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53  hmPerMap = unixS
23c40 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29  hmRegionPerMap()
23c50 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69  ;.  int nReqRegi
23c60 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  on;..  /* If the
23c70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
23c80 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
23c90 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
23ca0 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69  n it now. */.  i
23cb0 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  f( pDbFd->pShm==
23cc0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e  0 ){.    rc = un
23cd0 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
23ce0 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
23cf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23d00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
23d10 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  }..  p = pDbFd->
23d20 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  pShm;.  pShmNode
23d30 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
23d40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
23d50 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
23d60 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
23d70 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
23d80 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
23d90 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
23da0 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ion==0 );.  asse
23db0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
23dc0 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
23dd0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
23de0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
23df0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
23e00 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
23e10 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
23e20 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
23e30 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
23e40 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
23e50 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  ;..  /* Minimum 
23e60 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e  number of region
23e70 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  s required to be
23e80 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52   mapped. */.  nR
23e90 65 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65  eqRegion = ((iRe
23ea0 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29  gion+nShmPerMap)
23eb0 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a   / nShmPerMap) *
23ec0 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20   nShmPerMap;..  
23ed0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
23ee0 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e  egion<nReqRegion
23ef0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   ){.    char **a
23f00 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
23f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
23f20 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72  w apRegion[] arr
23f30 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
23f40 79 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e  yte = nReqRegion
23f50 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20  *szRegion;   /* 
23f60 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
23f70 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
23f80 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
23f90 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
23fa0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
23fb0 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20  fstat() */..    
23fc0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
23fd0 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
23fe0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
23ff0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
24000 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
24010 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
24020 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
24030 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
24040 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a  s space..      *
24050 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
24060 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
24070 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
24080 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
24090 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ile is.      ** 
240a0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
240b0 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
240c0 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
240d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
240e0 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f  ( osFstat(pShmNo
240f0 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
24100 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
24110 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
24120 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  IZE;.        got
24130 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24140 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
24150 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
24160 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
24170 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
24180 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
24190 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
241a0 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20  . If bExtend is 
241b0 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  set to.        *
241c0 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
241d0 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
241e0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
241f0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24200 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ned..        */.
24210 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78          if( !bEx
24220 74 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tend ){.        
24230 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
24240 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
24250 20 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e         /* Altern
24260 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74  atively, if bExt
24270 65 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78 74  end is true, ext
24280 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f  end the file. Do
24290 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20   this by.       
242a0 20 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69   ** writing a si
242b0 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65  ngle byte to the
242c0 20 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53   end of each (OS
242d0 29 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20  ) page being.   
242e0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
242f0 64 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54  d or extended. T
24300 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e  echnically, we n
24310 65 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  eed only write t
24320 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
24330 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72   last page in or
24340 64 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68  der to extend th
24350 65 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74  e file. But writ
24360 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20  ing to all new. 
24370 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20         ** pages 
24380 66 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f  forces the OS to
24390 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69   allocate them i
243a0 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63  mmediately, whic
243b0 68 20 72 65 64 75 63 65 73 0a 20 20 20 20 20 20  h reduces.      
243c0 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73    ** the chances
243d0 20 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c 65   of SIGBUS while
243e0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d   accessing the m
243f0 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74  apped region lat
24400 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  er on..        *
24410 2f 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a  /.        else{.
24420 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
24430 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
24440 3d 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20  = 4096;.        
24450 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20    int iPg;..    
24460 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
24470 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  o the last byte 
24480 6f 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c  of each newly al
24490 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e  located or exten
244a0 64 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ded page */.    
244b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e        assert( (n
244c0 42 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20  Byte % pgsz)==0 
244d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
244e0 28 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73  (iPg=(sStat.st_s
244f0 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28  ize/pgsz); iPg<(
24500 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67  nByte/pgsz); iPg
24510 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
24520 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74   if( seekAndWrit
24530 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  eFd(pShmNode->h,
24540 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a   iPg*pgsz + pgsz
24550 2d 31 2c 20 22 22 2c 20 31 2c 20 30 29 21 3d 31  -1, "", 1, 0)!=1
24560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24570 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
24580 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ile = pShmNode->
24590 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
245a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
245b0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
245c0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
245d0 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29   "write", zFile)
245e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
245f0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
24610 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24620 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24630 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
24640 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
24650 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
24660 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
24670 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
24680 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63  /.    apNew = (c
24690 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  har **)sqlite3_r
246a0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
246b0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
246c0 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73  on, nReqRegion*s
246d0 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20  izeof(char *).  
246e0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
246f0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
24700 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
24710 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
24720 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
24730 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
24740 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e  ->apRegion = apN
24750 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ew;.    while( p
24760 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
24770 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20  <nReqRegion ){. 
24780 20 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20       int nMap = 
24790 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72  szRegion*nShmPer
247a0 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Map;.      int i
247b0 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  ;.      void *pM
247c0 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  em;.      if( pS
247d0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
247e0 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f          pMem = o
247f0 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20  sMmap(0, nMap,. 
24800 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
24810 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
24820 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52  ? PROT_READ : PR
24830 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49  OT_READ|PROT_WRI
24840 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  TE, .           
24850 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68   MAP_SHARED, pSh
24860 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69  mNode->h, szRegi
24870 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65  on*(i64)pShmNode
24880 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20  ->nRegion.      
24890 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
248a0 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45   pMem==MAP_FAILE
248b0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
248c0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
248d0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
248e0 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53  MMAP, "mmap", pS
248f0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
24900 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
24910 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
24920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
24940 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Mem = sqlite3_ma
24950 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e 29  lloc64(szRegion)
24960 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
24970 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
24980 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
24990 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
249a0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
249b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
249c0 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c      memset(pMem,
249d0 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   0, szRegion);. 
249e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
249f0 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72  r(i=0; i<nShmPer
24a00 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Map; i++){.     
24a10 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
24a20 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
24a30 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28  nRegion+i] = &((
24a40 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65  char*)pMem)[szRe
24a50 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d  gion*i];.      }
24a60 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
24a70 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d  >nRegion += nShm
24a80 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20  PerMap;.    }.  
24a90 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
24aa0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
24ab0 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
24ac0 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68  ){.    *pp = pSh
24ad0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
24ae0 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73  iRegion];.  }els
24af0 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
24b00 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f    }.  if( pShmNo
24b10 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26  de->isReadonly &
24b20 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
24b30 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45  ) rc = SQLITE_RE
24b40 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65  ADONLY;.  sqlite
24b50 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
24b60 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
24b70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24b80 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
24b90 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
24ba0 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
24bb0 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  segment..**.** N
24bc0 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c  ote that the rel
24bd0 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
24be0 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43  n SHAREd and EXC
24bf0 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20  LUSIVE locks is 
24c00 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66  a little.** diff
24c10 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20  erent here than 
24c20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53  in posix.  In xS
24c30 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61  hmLock(), one ca
24c40 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  n go from unlock
24c50 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20  ed.** to shared 
24c60 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d  and back or from
24c70 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63   unlocked to exc
24c80 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e  lusive and back.
24c90 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a    But one may.**
24ca0 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61   not go from sha
24cb0 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  red to exclusive
24cc0 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69   or from exclusi
24cd0 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f  ve to shared..*/
24ce0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
24cf0 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74  ShmLock(.  sqlit
24d00 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
24d10 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
24d20 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
24d30 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
24d40 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
24d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d60 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74   /* First lock t
24d70 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
24d80 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c  ease */.  int n,
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24db0 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69  f locks to acqui
24dc0 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
24dd0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24df0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
24e00 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a   the lock */.){.
24e10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
24e20 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
24e30 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  d;      /* Conne
24e40 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68  ction holding sh
24e50 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
24e60 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44   unixShm *p = pD
24e70 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
24e80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
24e90 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e  ared memory bein
24ea0 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  g locked */.  un
24eb0 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  ixShm *pX;      
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
24ee0 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c  ng over all sibl
24ef0 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ings */.  unixSh
24f00 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
24f10 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20  = p->pShmNode;  
24f20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
24f30 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a  g file iNode */.
24f40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24f50 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
24f60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
24f70 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
24f80 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fa0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
24fb0 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
24fc0 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
24fd0 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
24fe0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
24ff0 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
25000 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
25010 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
25020 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
25030 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
25040 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
25050 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
25060 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
25070 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
25080 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
25090 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
250a0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
250b0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
250c0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
250d0 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
250e0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
250f0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
25100 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
25110 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
25120 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
25130 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
25140 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
25150 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
25160 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
25170 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
25180 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)!=0 );.  asser
25190 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
251a0 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
251b0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
251c0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
251d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
251e0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
251f0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
25200 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31   );..  mask = (1
25210 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
25220 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72  <<ofst);.  asser
25230 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d  t( n>1 || mask==
25240 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73  (1<<ofst) );.  s
25250 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
25260 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
25270 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ex);.  if( flags
25280 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e   & SQLITE_SHM_UN
25290 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20  LOCK ){.    u16 
252a0 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20  allMask = 0; /* 
252b0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65  Mask of locks he
252c0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a  ld by siblings *
252d0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66  /..    /* See if
252e0 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f   any siblings ho
252f0 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63  ld this same loc
25300 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d  k */.    for(pX=
25310 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
25320 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
25330 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
25340 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==p ) continue;
25350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
25360 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28  pX->exclMask & (
25370 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73  p->exclMask|p->s
25380 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29  haredMask))==0 )
25390 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20  ;.      allMask 
253a0 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
253b0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
253c0 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74   Unlock the syst
253d0 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a  em-level locks *
253e0 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20  /.    if( (mask 
253f0 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b  & allMask)==0 ){
25400 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
25410 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
25420 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66  bFd, F_UNLCK, of
25430 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
25440 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
25450 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
25460 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
25470 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
25480 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
25490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
254a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
254b0 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
254c0 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
254d0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
254e0 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
254f0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
25500 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
25510 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
25520 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
25530 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
25540 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
25550 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
25560 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
25570 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
25580 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
25590 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
255a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
255b0 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
255c0 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
255d0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
255e0 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
255f0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
25600 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
25610 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
25620 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
25630 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
25640 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
25650 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
25660 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
25670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
25680 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
25690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
256a0 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
256b0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
256c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
256d0 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
256e0 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
256f0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
25700 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25720 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
25730 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
25740 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
25750 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
25760 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  d, F_RDLCK, ofst
25770 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
25780 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
25790 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
257a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
257b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
257c0 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
257d0 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
257e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
257f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
25800 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
25810 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
25820 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
25830 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
25840 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
25850 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
25860 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
25870 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
25880 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
25890 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
258a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
258b0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
258c0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
258d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
258e0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
258f0 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
25900 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
25910 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
25920 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25930 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
25940 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25950 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
25960 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
25970 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
25980 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
25990 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
259a0 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
259b0 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
259c0 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
259d0 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
259e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
259f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
25a00 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
25a10 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43  ck(pDbFd, F_WRLC
25a20 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
25a30 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
25a40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25a50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
25a60 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
25a70 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
25a80 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
25a90 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
25aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25ab0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
25ac0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
25ad0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
25ae0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73  ACE(("SHM-LOCK s
25af0 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20  hmid-%d, pid-%d 
25b00 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  got %03x,%03x\n"
25b10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
25b20 69 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c  id, osGetpid(0),
25b30 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
25b40 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  p->exclMask));. 
25b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25b60 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
25b70 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
25b80 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
25b90 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
25ba0 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
25bb0 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
25bc0 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
25bd0 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
25be0 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
25bf0 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
25c00 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
25c10 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
25c20 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
25c30 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
25c40 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
25c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
25c60 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
25c70 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
25c80 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
25c90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
25ca0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65  fd);.  sqlite3Me
25cb0 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20  moryBarrier();  
25cc0 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c         /* compil
25cd0 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72  er-defined memor
25ce0 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 75  y barrier */.  u
25cf0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d10 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f  * Also mutex, fo
25d20 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a  r redundancy */.
25d30 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
25d40 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
25d50 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
25d60 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
25d70 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
25d80 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
25d90 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
25da0 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
25db0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
25dc0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
25dd0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
25de0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
25df0 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
25e00 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
25e10 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
25e20 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
25e30 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
25e40 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
25e50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
25e60 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
25e70 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
25e80 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
25e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
25ea0 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
25eb0 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
25ec0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
25ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ee0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
25ef0 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
25f00 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
25f10 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
25f20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
25f30 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
25f40 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
25f50 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
25f80 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
25f90 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
25fa0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
25fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25fc0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
25fd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25fe0 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
25ff0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
26000 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
26010 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
26020 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
26030 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
26040 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
26050 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
26060 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
26070 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
26080 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
26090 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
260a0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
260b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
260c0 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
260d0 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
260e0 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
260f0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
26100 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
26110 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
26120 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
26130 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
26140 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
26150 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
26160 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
26170 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
26180 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
26190 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
261a0 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
261b0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
261c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
261d0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
261e0 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
261f0 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
26200 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
26210 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
26220 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
26230 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
26240 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
26250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
26260 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
26270 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
26280 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
26290 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
262a0 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
262b0 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e  ag && pShmNode->
262c0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  h>=0 ){.      os
262d0 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
262e0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
262f0 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75   }.    unixShmPu
26300 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a  rge(pDbFd);.  }.
26310 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
26320 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
26330 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c  LITE_OK;.}...#el
26340 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
26350 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
26360 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
26370 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
26380 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30  unixShmBarrier 0
26390 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
263a0 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
263b0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
263c0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
263d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
263e0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
263f0 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65  * If it is curre
26400 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ntly memory mapp
26410 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70  ed, unmap file p
26420 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Fd..*/.static vo
26430 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
26440 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
26450 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
26460 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
26470 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
26480 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d  egion ){.    osM
26490 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52  unmap(pFd->pMapR
264a0 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70  egion, pFd->mmap
264b0 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20  SizeActual);.   
264c0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
264d0 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
264e0 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
264f0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
26500 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tual = 0;.  }.}.
26510 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
26520 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f  o set the size o
26530 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  f the memory map
26540 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20  ping maintained 
26550 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63  by file .** desc
26560 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e  riptor pFd to nN
26570 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78  ew bytes. Any ex
26580 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
26590 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a  s discarded..**.
265a0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
265b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
265c0 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sets the followi
265d0 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a  ng variables:.**
265e0 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
265f0 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a  le.pMapRegion.**
26600 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
26610 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20  mmapSize.**     
26620 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
26630 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20  izeActual.**.** 
26640 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  If unsuccessful,
26650 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
26660 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20  e is logged via 
26670 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e  sqlite3_log() an
26680 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76  d.** the three v
26690 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61  ariables above a
266a0 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68  re zeroed. In th
266b0 69 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73  is case SQLite s
266c0 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75  hould.** continu
266d0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
266e0 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
266f0 68 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78  he xRead() and x
26700 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f  Write().** metho
26710 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
26720 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65  id unixRemapfile
26730 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
26740 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
26750 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
26760 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  riptor object */
26770 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20  .  i64 nNew     
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26790 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d     /* Required m
267a0 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29  apping size */.)
267b0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
267c0 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20  zErr = "mmap";. 
267d0 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b   int h = pFd->h;
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267f0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
26800 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
26810 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38   db file */.  u8
26820 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29   *pOrig = (u8 *)
26830 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b  pFd->pMapRegion;
26840 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
26850 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61   current file ma
26860 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e  pping */.  i64 n
26870 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  Orig = pFd->mmap
26880 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
26890 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67  /* Size of pOrig
268a0 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73   region in bytes
268b0 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d   */.  u8 *pNew =
268c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
268d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
268e0 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61  cation of new ma
268f0 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66  pping */.  int f
26900 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44  lags = PROT_READ
26910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26920 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
26930 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20   to mmap() */.. 
26940 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
26950 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
26960 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64  assert( nNew>pFd
26970 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
26980 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46  assert( nNew<=pF
26990 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
269a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
269b0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
269c0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
269d0 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  ual>=pFd->mmapSi
269e0 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
269f0 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b  MAP_FAILED!=0 );
26a00 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26a10 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20  MMAP_READWRITE. 
26a20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
26a30 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
26a40 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61  RDONLY)==0 ) fla
26a50 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45  gs |= PROT_WRITE
26a60 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
26a70 70 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56  pOrig ){.#if HAV
26a80 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34  E_MREMAP.    i64
26a90 20 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d   nReuse = pFd->m
26aa0 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20  mapSize;.#else. 
26ab0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53     const int szS
26ac0 79 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61  yspage = osGetpa
26ad0 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36  gesize();.    i6
26ae0 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d  4 nReuse = (pFd-
26af0 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a  >mmapSize & ~(sz
26b00 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e  Syspage-1));.#en
26b10 64 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71  dif.    u8 *pReq
26b20 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65   = &pOrig[nReuse
26b30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70  ];..    /* Unmap
26b40 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68   any pages of th
26b50 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
26b60 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ng that cannot b
26b70 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20  e reused. */.   
26b80 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72   if( nReuse!=nOr
26b90 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  ig ){.      osMu
26ba0 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67  nmap(pReq, nOrig
26bb0 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a  -nReuse);.    }.
26bc0 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
26bd0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72  .    pNew = osMr
26be0 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  emap(pOrig, nReu
26bf0 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50  se, nNew, MREMAP
26c00 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a  _MAYMOVE);.    z
26c10 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a  Err = "mremap";.
26c20 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
26c30 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e   osMmap(pReq, nN
26c40 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73  ew-nReuse, flags
26c50 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
26c60 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66   nReuse);.    if
26c70 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c  ( pNew!=MAP_FAIL
26c80 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
26c90 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20  pNew!=pReq ){.  
26ca0 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
26cb0 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75  New, nNew - nReu
26cc0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  se);.        pNe
26cd0 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  w = 0;.      }el
26ce0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
26cf0 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20   = pOrig;.      
26d00 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
26d10 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d      /* The attem
26d20 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  pt to extend the
26d30 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
26d40 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69  g failed. Free i
26d50 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e  t. */.    if( pN
26d60 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c  ew==MAP_FAILED |
26d70 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  | pNew==0 ){.   
26d80 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69     osMunmap(pOri
26d90 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  g, nReuse);.    
26da0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
26db0 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c  New is still NUL
26dc0 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  L, try to create
26dd0 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77   an entirely new
26de0 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69   mapping. */.  i
26df0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
26e00 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
26e10 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20  0, nNew, flags, 
26e20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30  MAP_SHARED, h, 0
26e30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  );.  }..  if( pN
26e40 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew==MAP_FAILED )
26e50 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  {.    pNew = 0;.
26e60 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20      nNew = 0;.  
26e70 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53    unixLogError(S
26e80 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20  QLITE_OK, zErr, 
26e90 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  pFd->zPath);..  
26ea0 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70    /* If the mmap
26eb0 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c  () above failed,
26ec0 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c   assume that all
26ed0 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70   subsequent mmap
26ee0 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
26ef0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61  will probably fa
26f00 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63  il too. Fall bac
26f10 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64  k to using xRead
26f20 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76  /xWrite exclusiv
26f30 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ely.    ** in th
26f40 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
26f50 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
26f60 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  x = 0;.  }.  pFd
26f70 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
26f80 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
26f90 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
26fa0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
26fb0 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a  al = nNew;.}../*
26fc0 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
26fd0 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
26fe0 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
26ff0 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
27000 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
27010 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
27020 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
27030 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
27040 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
27050 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
27060 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
27070 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
27080 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
27090 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
270a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
270b0 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
270c0 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
270d0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
270e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
270f0 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
27100 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
27110 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
27120 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
27130 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
27140 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
27150 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
27160 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
27170 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
27180 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
27190 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
271a0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
271b0 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
271c0 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
271d0 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
271e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
271f0 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
27200 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
27210 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
27220 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68  L_MMAP_LIMIT, wh
27230 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
27240 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
27250 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
27260 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
27270 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
27280 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
27290 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
272a0 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
272b0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
272c0 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
272d0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
272e0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
272f0 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
27300 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
27310 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
27320 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65  i64 nMap = nByte
27330 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
27340 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
27350 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
27360 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64  ==0 );.  if( pFd
27370 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
27380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27390 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
273a0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
273b0 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
273c0 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
273d0 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
273e0 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f  on */.    rc = o
273f0 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26  sFstat(pFd->h, &
27400 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
27410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27420 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
27430 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
27440 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  AT;.    }.    nM
27450 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ap = statbuf.st_
27460 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  size;.  }.  if( 
27470 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nMap>pFd->mmapSi
27480 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61  zeMax ){.    nMa
27490 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  p = pFd->mmapSiz
274a0 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  eMax;.  }..  if(
274b0 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
274c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
274d0 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20  nMap>0 ){.      
274e0 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46  unixRemapfile(pF
274f0 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65  d, nMap);.    }e
27500 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 69 78 55  lse{.      unixU
27510 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
27520 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
27530 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27540 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
27550 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
27560 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
27570 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
27580 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
27590 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
275a0 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
275b0 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
275c0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
275d0 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
275e0 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
275f0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
27600 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
27610 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
27620 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
27630 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
27640 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
27650 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
27660 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
27670 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
27680 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
27690 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
276a0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
276b0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
276c0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
276d0 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
276e0 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
276f0 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
27700 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
27710 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
27720 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
27730 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
27740 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72  eventually .** r
27750 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
27760 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  ence by calling 
27770 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a  unixUnfetch()..*
27780 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27790 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  xFetch(sqlite3_f
277a0 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
277b0 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69  f, int nAmt, voi
277c0 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c  d **pp){.#if SQL
277d0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
277e0 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  E>0.  unixFile *
277f0 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  pFd = (unixFile 
27800 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
27810 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
27820 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  se file */.#endi
27830 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69  f.  *pp = 0;..#i
27840 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
27850 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
27860 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  Fd->mmapSizeMax>
27870 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64  0 ){.    if( pFd
27880 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20  ->pMapRegion==0 
27890 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
278a0 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
278b0 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
278c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
278d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
278e0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e   }.    if( pFd->
278f0 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66  mmapSize >= iOff
27900 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a  +nAmt ){.      *
27910 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64  pp = &((u8 *)pFd
27920 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
27930 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ff];.      pFd->
27940 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20  nFetchOut++;.   
27950 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
27960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
27980 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
27990 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
279a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
279b0 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20   releases a .** 
279c0 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
279d0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
279e0 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74   call to unixFet
279f0 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
27a00 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
27a10 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
27a20 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
27a30 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
27a40 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
27a50 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
27a60 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e  passed to the un
27a70 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61  ixFetch() invoca
27a80 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c  tion. .**.** Or,
27a90 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
27aa0 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
27ab0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
27ac0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
27ad0 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d  ed .** to inform
27ae0 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74   the VFS layer t
27af0 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  hat, according t
27b00 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69  o POSIX, any exi
27b10 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a  sting mapping .*
27b20 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76  * may now be inv
27b30 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
27b40 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a  be unmapped..*/.
27b50 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
27b60 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
27b70 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
27b80 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66  f, void *p){.#if
27b90 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27ba0 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
27bb0 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
27bc0 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
27bd0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
27be0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
27bf0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27c00 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49  R(iOff);..  /* I
27c10 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
27c20 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
27c30 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
27c40 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
27c50 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65   .  ** xFetch re
27c60 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66  ferences. Or, if
27c70 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69   p!=0 (meaning i
27c80 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72  t is an xFetch r
27c90 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20  eference),.  ** 
27ca0 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
27cb0 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
27cc0 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f  outstanding.  */
27cd0 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30  .  assert( (p==0
27ce0 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f  )==(pFd->nFetchO
27cf0 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ut==0) );..  /* 
27d00 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74  If p!=0, it must
27d10 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20   match the iOff 
27d20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65  value. */.  asse
27d30 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26  rt( p==0 || p==&
27d40 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
27d50 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b  Region)[iOff] );
27d60 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
27d70 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
27d80 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
27d90 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
27da0 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  d);.  }..  asser
27db0 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
27dc0 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20  t>=0 );.#else.  
27dd0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27de0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
27df0 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55  ARAMETER(p);.  U
27e00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27e10 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20  iOff);.#endif.  
27e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  ;.}../*.** Here 
27e40 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
27e50 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
27e60 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
27e70 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
27e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
27e90 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
27ea0 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
27eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ec0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
27ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f10 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
27f20 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
27f30 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
27f40 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f  s of sqlite3_io_
27f50 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
27f60 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  that.** implemen
27f70 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c  t various file l
27f80 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
27f90 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74  s.  It also cont
27fa0 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
27fb0 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20  .** of "finder" 
27fc0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69  functions.  A fi
27fd0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
27fe0 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20   used to locate 
27ff0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
28000 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ** sqlite3_io_me
28010 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72  thods object for
28020 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
28030 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
28040 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69  e pAppData.** fi
28050 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
28060 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63  e3_vfs VFS objec
28070 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ts are initializ
28080 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72  ed to be pointer
28090 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72  s to.** the corr
280a0 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ect finder-funct
280b0 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53  ion for that VFS
280c0 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e  ..**.** Most fin
280d0 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  der functions re
280e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
280f0 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
28100 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
28110 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c  object.  The onl
28120 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69  y interesting fi
28130 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
28140 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
28150 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b  r, which.** look
28160 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
28170 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69  tem type and tri
28180 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20  es to guess the 
28190 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  best locking.** 
281a0 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68  strategy from th
281b0 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69  at..**.** For fi
281c0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c  nder-function F,
281d0 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
281e0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
281f0 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
28200 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
28210 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
28220 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
28230 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
28240 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
28250 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
28260 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
28270 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
28280 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
28290 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
282a0 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
282b0 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
282c0 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
282d0 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
282e0 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
282f0 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
28300 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
28310 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
28320 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
28330 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
28340 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
28350 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
28360 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
28370 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
28380 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
28390 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
283a0 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
283b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
283c0 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
283d0 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
283e0 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
283f0 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
28400 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
28410 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
28420 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
28430 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
28440 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
28450 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
28460 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
28470 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
28480 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
28490 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
284a0 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
284b0 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e  R,METHOD,VERSION
284c0 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f  ,CLOSE,LOCK,UNLO
284d0 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50  CK,CKLOCK,SHMMAP
284e0 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63  )     \.static c
284f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
28500 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
28510 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28530 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
28540 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
28550 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
28560 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285a0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
285b0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
285e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
285f0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
28630 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28640 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28670 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
28680 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
28690 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
286a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286e0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28710 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
28720 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28730 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28760 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28780 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
287b0 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
287d0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28800 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28820 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
28830 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
28840 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28850 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
28860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28870 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
288a0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
288b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
288c0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
288f0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
28900 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
28910 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
28920 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28930 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d          \.   SHM
28940 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20  MAP,            
28950 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
28960 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Map */          
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28990 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
289a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
289b0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
289c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289d0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
289e0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
289f0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
28a00 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20  rrier */        
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
28a30 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mUnmap,         
28a40 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
28a50 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74      \.   unixFet
28a80 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
28a90 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a       /* xFetch *
28aa0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65     \.   unixUnfe
28ad0 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
28ae0 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20      /* xUnfetch 
28af0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20    \.};          
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
28b70 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28b80 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c  ds *FINDER##Impl
28b90 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
28ba0 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20  unixFile *p){   
28bb0 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  \.  UNUSED_PARAM
28bc0 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f  ETER(z); UNUSED_
28bd0 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28c00 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f  .  return &METHO
28c10 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28c50 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
28ca0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
28cb0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
28cc0 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28  (*const FINDER)(
28cd0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
28ce0 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20  File *p)    \.  
28cf0 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c    = FINDER##Impl
28d00 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72  ;../*.** Here ar
28d10 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c  e all of the sql
28d20 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
28d30 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
28d40 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69   of the.** locki
28d50 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
28d60 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  Functions that r
28d70 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74  eturn pointers t
28d80 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a  o these methods.
28d90 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61  ** are also crea
28da0 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44  ted..*/.IOMETHOD
28db0 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  S(.  posixIoFind
28dc0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
28dd0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
28de0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69  n name */.  posi
28df0 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  xIoMethods,     
28e00 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
28e10 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
28e20 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e40 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
28e50 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70   memory and mmap
28e60 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   are enabled */.
28e70 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
28e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28e90 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
28ea0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28ec0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
28ed0 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20   unixUnlock,    
28ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
28ef0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
28f00 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
28f10 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78  vedLock,    /* x
28f20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28f30 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
28f40 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20  ixShmMap        
28f50 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
28f60 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
28f70 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
28f80 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
28f90 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
28fa0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
28fb0 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
28fc0 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
28fd0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28fe0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
28ff0 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  /.  3,          
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29010 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
29020 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
29030 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  nolockClose,    
29040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29050 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29060 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  nolockLock,     
29070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
29080 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
29090 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  olockUnlock,    
290a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
290b0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
290c0 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
290d0 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68  vedLock,  /* xCh
290e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
290f0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
29120 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
29130 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
29140 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
29150 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29160 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29170 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
29180 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
29190 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
291a0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
291b0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
291c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
291d0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
291e0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
291f0 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
29200 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
29210 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
29220 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
29230 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29240 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
29250 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
29260 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29270 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
29280 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
29290 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63  edLock, /* xChec
292a0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
292b0 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
292c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292d0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
292e0 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20  ethod */.)..#if 
292f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29300 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
29310 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
29320 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
29330 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
29340 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29350 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
29360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
29370 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29380 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29390 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
293a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
293b0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
293c0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
293d0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
293e0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
293f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
29400 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
29410 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29420 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
29430 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
29440 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29450 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
29460 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
29470 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock,   /* xCheck
29480 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29490 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294b0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
294c0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
294d0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
294e0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65  .IOMETHODS(.  se
294f0 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  mIoFinder,      
29500 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29510 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
29520 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64  */.  semIoMethod
29530 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
29540 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29550 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
29560 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29580 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29590 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
295a0 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20    semXClose,    
295b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
295c0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
295d0 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20    semXLock,     
295e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
295f0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29600 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20   semXUnlock,    
29610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
29620 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
29630 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72    semXCheckReser
29640 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78  vedLock,    /* x
29650 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29660 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
29670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29680 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29690 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
296a0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
296b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
296c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
296d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
296e0 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46  ETHODS(.  afpIoF
296f0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29700 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29710 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29720 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20   afpIoMethods,  
29730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
29740 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29750 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
29760 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
29770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29780 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
29790 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66  disabled */.  af
297a0 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  pClose,         
297b0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
297c0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  e method */.  af
297d0 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  pLock,          
297e0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
297f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
29800 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29810 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29820 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
29830 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
29840 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
29850 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29860 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29880 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
29890 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
298a0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  f../*.** The pro
298b0 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  xy locking metho
298c0 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65  d is a "super-me
298d0 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e  thod" in the sen
298e0 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70  se that it.** op
298f0 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69  ens secondary fi
29900 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
29910 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64  or the conch and
29920 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a   lock files and.
29930 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79  ** it uses proxy
29940 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c  , dot-file, AFP,
29950 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63   and flock() loc
29960 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
29970 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61  those.** seconda
29980 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74  ry files.  For t
29990 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
299a0 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
299b0 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78  plements.** prox
299c0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63  y locking is loc
299d0 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65  ated much furthe
299e0 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69  r down in the fi
299f0 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  le.  But we need
29a00 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
29a10 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73  and define the s
29a20 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29a30 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e  s and finder fun
29a40 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f  ction.** for pro
29a50 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e  xy locking here.
29a60 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20    So we forward 
29a70 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20  declare the I/O 
29a80 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20  methods..*/.#if 
29a90 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
29aa0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
29ab0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
29ac0 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
29ad0 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
29ae0 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
29af0 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
29b00 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
29b10 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
29b20 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
29b30 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
29b40 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
29b50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
29b60 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
29b70 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
29b80 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
29b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29ba0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
29bb0 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
29bc0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
29bd0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29be0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29bf0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c10 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29c20 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
29c30 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  d */.  proxyClos
29c40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
29c50 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
29c60 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
29c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29c80 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
29c90 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
29ca0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29cb0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
29cc0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
29cd0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
29ce0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
29cf0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
29d00 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
29d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
29d30 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e  /.).#endif../* n
29d40 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20  fs lockd on OSX 
29d50 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c  10.3+ doesn't cl
29d60 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  ear write locks 
29d70 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
29d80 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64   is set */.#if d
29d90 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
29da0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
29db0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
29dc0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66  .IOMETHODS(.  nf
29dd0 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  sIoFinder,      
29de0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
29df0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
29e00 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f   */.  nfsIoMetho
29e10 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
29e20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29e30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29e40 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e60 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
29e70 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
29e80 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ea0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29eb0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ed0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
29ee0 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c   */.  nfsUnlock,
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f00 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
29f10 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
29f20 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
29f30 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
29f40 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
29f50 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
29f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f70 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
29f80 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
29f90 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
29fa0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
29fb0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29fc0 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TYLE./* .** This
29fd0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
29fe0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  on attempts to d
29ff0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
2a000 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  t locking strate
2a010 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  gy .** for the d
2a020 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69  atabase file "fi
2a030 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65  lePath".  It the
2a040 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71  n returns the sq
2a050 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a060 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
2a070 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  implements that 
2a080 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20  strategy..**.** 
2a090 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f  This is for MacO
2a0a0 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  SX only..*/.stat
2a0b0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2a0c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
2a0d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
2a0e0 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
2a0f0 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
2a100 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2a110 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2a120 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
2a130 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e           /* open
2a140 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72   file object for
2a150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a160 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  le */.){.  stati
2a170 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d  c const struct M
2a180 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e  apping {.    con
2a190 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79  st char *zFilesy
2a1a0 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  stem;           
2a1b0 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d     /* Filesystem
2a1c0 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   type name */.  
2a1d0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
2a1e0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
2a1f0 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f  hods;   /* Appro
2a200 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
2a210 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61  ethod */.  } aMa
2a220 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68  p[] = {.    { "h
2a230 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
2a240 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2a250 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "ufs",    &posi
2a260 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
2a270 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61    { "afpfs",  &a
2a280 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
2a290 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26     { "smbfs",  &
2a2a0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
2a2b0 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20      { "webdav", 
2a2c0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2a2d0 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d   },.    { 0, 0 }
2a2e0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
2a2f0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
2a300 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  sInfo;.  struct 
2a310 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
2a320 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
2a330 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
2a340 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
2a350 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
2a360 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
2a370 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
2a380 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
2a390 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
2a3a0 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
2a3b0 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2a3c0 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ods;.  }.  if( s
2a3d0 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20  tatfs(filePath, 
2a3e0 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29  &fsInfo) != -1 )
2a3f0 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f  {.    if( fsInfo
2a400 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52  .f_flags & MNT_R
2a410 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72  DONLY ){.      r
2a420 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2a430 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
2a440 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b    for(i=0; aMap[
2a450 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  i].zFilesystem; 
2a460 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
2a470 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
2a480 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70  fstypename, aMap
2a490 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29  [i].zFilesystem)
2a4a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2a4b0 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d  eturn aMap[i].pM
2a4c0 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a  ethods;.      }.
2a4d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2a4e0 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61  Default case. Ha
2a4f0 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f  ndles, amongst o
2a500 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20  thers, "nfs"..  
2a510 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e  ** Test byte-ran
2a520 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63  ge lock using fc
2a530 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61  ntl(). If the ca
2a540 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20  ll succeeds, .  
2a550 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  ** assume that t
2a560 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2a570 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74  upports POSIX st
2a580 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f  yle locks. .  */
2a590 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65  .  lockInfo.l_le
2a5a0 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66  n = 1;.  lockInf
2a5b0 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  o.l_start = 0;. 
2a5c0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e   lockInfo.l_when
2a5d0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
2a5e0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65   lockInfo.l_type
2a5f0 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66   = F_RDLCK;.  if
2a600 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e  ( osFcntl(pNew->
2a610 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
2a620 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
2a630 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
2a640 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
2a650 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a  e, "nfs")==0 ){.
2a660 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66        return &nf
2a670 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  sIoMethods;.    
2a680 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
2a690 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
2a6a0 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  thods;.    }.  }
2a6b0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2a6c0 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
2a6d0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2a6e0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a6f0 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2a700 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
2a710 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
2a720 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
2a730 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2a740 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2a750 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
2a760 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2a770 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2a780 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56  YLE */..#if OS_V
2a790 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69  XWORKS./*.** Thi
2a7a0 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
2a7b0 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20  ion for VxWorks 
2a7c0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
2a7d0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a   posix advisory.
2a7e0 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  ** locking works
2a7f0 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  .  If it does, t
2a800 68 65 6e 20 74 68 61 74 20 69 73 20 77 68 61 74  hen that is what
2a810 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 69 74   is used.  If it
2a820 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72   does not.** wor
2a830 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b  k, then fallback
2a840 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68   to named semaph
2a850 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ore locking..*/.
2a860 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2a870 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a880 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72  *vxworksIoFinder
2a890 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
2a8a0 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
2a8b0 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
2a8c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2a8d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2a8e0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
2a8f0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
2a900 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
2a910 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
2a920 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
2a930 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
2a940 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
2a950 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
2a960 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2a970 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
2a980 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
2a990 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a9a0 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
2a9b0 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2a9c0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
2a9d0 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
2a9e0 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
2a9f0 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
2aa00 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
2aa10 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
2aa20 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
2aa30 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
2aa40 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
2aa50 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2aa60 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2aa70 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2aa80 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2aa90 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2aaa0 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2aab0 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2aac0 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2aad0 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2aae0 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
2aaf0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
2ab00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2ab10 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
2ab20 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2ab30 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2ab40 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2ab50 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46  const vxworksIoF
2ab60 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
2ab70 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
2ab80 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49  vxworksIoFinderI
2ab90 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
2aba0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f  OS_VXWORKS */../
2abb0 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74  *.** An abstract
2abc0 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e   type for a poin
2abd0 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74  ter to an IO met
2abe0 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
2abf0 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
2ac00 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2ac10 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
2ac20 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
2ac30 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
2ac40 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
2ac50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac90 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2aca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
2acb0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
2acc0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
2acd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2ace0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
2acf0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
2ad00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2ad10 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
2ad20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
2ad30 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
2ad40 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2ad50 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2ad60 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2ad70 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
2ad80 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
2ad90 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
2ada0 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
2adb0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
2adc0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
2add0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2ade0 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
2adf0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
2ae00 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
2ae10 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2ae20 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
2ae30 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
2ae40 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
2ae50 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
2ae60 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
2ae70 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2ae80 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
2ae90 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
2aea0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74  ened */.  int ct
2aeb0 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
2aec0 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
2aed0 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c  e UNIXFILE_* val
2aee0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ues */.){.  cons
2aef0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2af00 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74  hods *pLockingSt
2af10 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
2af20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
2af30 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
2af40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2af50 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2af60 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a  pInode==NULL );.
2af70 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68  .  /* Usually th
2af80 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65  e path zFilename
2af90 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
2afa0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
2afb0 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63  me. The.  ** exc
2afc0 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f  eption is when o
2afd0 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79  pening the proxy
2afe0 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e   "conch" file in
2aff0 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a   builds that.  *
2b000 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70  * include the sp
2b010 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b  ecial Apple lock
2b020 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f  ing styles..  */
2b030 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2b040 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2b050 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b060 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28  _STYLE.  assert(
2b070 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
2b080 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27   zFilename[0]=='
2b090 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d  /' .    || pVfs-
2b0a0 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64  >pAppData==(void
2b0b0 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
2b0c0 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61  der );.#else.  a
2b0d0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2b0e0 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
2b0f0 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64  [0]=='/' );.#end
2b100 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b  if..  /* No lock
2b110 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65  ing occurs in te
2b120 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f  mporary files */
2b130 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
2b140 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c  name!=0 || (ctrl
2b150 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2b160 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a  _NOLOCK)!=0 );..
2b170 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
2b180 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
2b190 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  h, zFilename));.
2b1a0 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
2b1b0 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56   pNew->pVfs = pV
2b1c0 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74  fs;.  pNew->zPat
2b1d0 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2b1e0 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2b1f0 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73   = (u8)ctrlFlags
2b200 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
2b210 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
2b220 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  New->mmapSizeMax
2b230 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
2b240 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23  Config.szMmap;.#
2b250 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
2b260 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2b270 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ((ctrlFlags & UN
2b280 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46  IXFILE_URI) ? zF
2b290 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20  ilename : 0),.  
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2b0 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c           "psow",
2b2c0 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
2b2d0 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
2b2e0 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2b2f0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2b300 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  PSOW;.  }.  if( 
2b310 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61  strcmp(pVfs->zNa
2b320 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d  me,"unix-excl")=
2b330 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
2b340 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2b350 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a  XFILE_EXCL;.  }.
2b360 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2b370 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
2b380 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
2b390 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
2b3a0 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
2b3b0 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20  {.    ctrlFlags 
2b3c0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  |= UNIXFILE_NOLO
2b3d0 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  CK;.    rc = SQL
2b3e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
2b3f0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72  endif..  if( ctr
2b400 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2b410 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  E_NOLOCK ){.    
2b420 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
2b430 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2b440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2b450 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28  LockingStyle = (
2b460 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29  **(finder_type*)
2b470 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28  pVfs->pAppData)(
2b480 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29  zFilename, pNew)
2b490 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2b4a0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2b4b0 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a  E.    /* Cache z
2b4c0 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20  Filename in the 
2b4d0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2b4e0 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b  (AFP and dotlock
2b4f0 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20   override) for. 
2b500 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20     ** proxyLock 
2b510 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f  activation is po
2b520 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70  ssible (remote p
2b530 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e  roxy is based on
2b540 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a   db name).    **
2b550 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69   zFilename remai
2b560 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66  ns valid until f
2b570 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ile is closed, t
2b580 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20  o support */.   
2b590 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2b5a0 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a  ntext = (void*)z
2b5b0 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66  Filename;.#endif
2b5c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63  .  }..  if( pLoc
2b5d0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f  kingStyle == &po
2b5e0 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66  sixIoMethods.#if
2b5f0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2b600 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2b610 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b620 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69  LE.    || pLocki
2b630 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49  ngStyle == &nfsI
2b640 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a  oMethods.#endif.
2b650 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74    ){.    unixEnt
2b660 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
2b670 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2b680 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2b690 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
2b6a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b6b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
2b6c0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2b6d0 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  n findInodeInfo(
2b6e0 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ), close the fil
2b6f0 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20  e descriptor.   
2b700 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
2b710 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73  y, before releas
2b720 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66  ing the mutex. f
2b730 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d  indInodeInfo() m
2b740 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
2b750 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
2b760 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
2b770 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
2b780 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
2b790 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
2b7a0 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
2b7b0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
2b7c0 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
2b7d0 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
2b7e0 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
2b7f0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
2b800 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
2b810 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2b820 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2b830 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2b840 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
2b850 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
2b860 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
2b870 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
2b880 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
2b890 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2b8a0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
2b8b0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2b8c0 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74  case, it is quit
2b8d0 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a  e safe to close.
2b8e0 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
2b8f0 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61  h - as it is gua
2b900 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20  ranteed that no 
2b910 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c  posix locks will
2b920 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20   be released.   
2b930 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73     ** by doing s
2b940 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o..      **.    
2b950 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f    ** If scenario
2b960 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20   (a) caused the 
2b970 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67  error then thing
2b980 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66  s are not so saf
2b990 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  e. The.      ** 
2b9a0 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74  implicit assumpt
2b9b0 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74  ion here is that
2b9c0 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c   if fstat() fail
2b9d0 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e  s, things are in
2b9e0 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62  .      ** such b
2b9f0 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72  ad shape that dr
2ba00 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72  opping a lock or
2ba10 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74   two doesn't mat
2ba20 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20  ter much..      
2ba30 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  */.      robust_
2ba40 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2ba50 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2ba60 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
2ba70 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2ba80 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
2ba90 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2baa0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2bab0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
2bac0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2bad0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
2bae0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2baf0 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
2bb00 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2bb10 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2bb20 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2bb30 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
2bb40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
2bb50 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
2bb60 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2bb70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
2bb80 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
2bb90 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
2bba0 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43  oc64( sizeof(*pC
2bbb0 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
2bbc0 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
2bbd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2bbe0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2bbf0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
2bc00 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
2bc10 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2bc20 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
2bc30 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
2bc40 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
2bc50 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
2bc60 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
2bc70 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
2bc80 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
2bc90 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
2bca0 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
2bcb0 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2bcc0 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
2bcd0 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
2bce0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
2bcf0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2bd00 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
2bd10 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2bd20 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2bd30 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
2bd40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bd50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2bd60 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
2bd70 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
2bd80 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2bd90 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2bda0 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
2bdb0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
2bdc0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2bdd0 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
2bde0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2bdf0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2be00 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
2be10 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
2be20 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
2be30 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2be40 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2be50 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
2be60 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
2be70 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
2be80 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
2be90 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
2bea0 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
2beb0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
2bec0 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
2bed0 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
2bee0 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
2bef0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
2bf00 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
2bf10 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2bf20 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e  _malloc64(nFilen
2bf30 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c  ame);.    if( zL
2bf40 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ockFile==0 ){.  
2bf50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bf60 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2bf70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2bf80 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61  snprintf(nFilena
2bf90 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22  me, zLockFile, "
2bfa0 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  %s" DOTLOCK_SUFF
2bfb0 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  IX, zFilename);.
2bfc0 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
2bfd0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2bfe0 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a   zLockFile;.  }.
2bff0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2c000 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2c010 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d  ingStyle == &sem
2c020 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2c030 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68   /* Named semaph
2c040 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ore locking uses
2c050 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2c060 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2c070 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64  .    ** included
2c080 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69   in the semLocki
2c090 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f  ngContext.    */
2c0a0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
2c0b0 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
2c0c0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2c0d0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2c0e0 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d  e);.    if( (rc=
2c0f0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28  =SQLITE_OK) && (
2c100 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2c110 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  em==NULL) ){.   
2c120 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d     char *zSemNam
2c130 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  e = pNew->pInode
2c140 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20  ->aSemName;.    
2c150 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73    int n;.      s
2c160 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2c170 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53  MAX_PATHNAME, zS
2c180 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d  emName, "/%s.sem
2c190 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c1a0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2c1b0 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
2c1c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
2c1d0 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=1; zSemName[n
2c1e0 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
2c1f0 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
2c200 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
2c210 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
2c220 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2c230 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a  Sem = sem_open(z
2c240 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54  SemName, O_CREAT
2c250 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20  , 0666, 1);.    
2c260 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f    if( pNew->pIno
2c270 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  de->pSem == SEM_
2c280 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
2c290 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2c2a0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
2c2b0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2c2c0 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
2c2d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c2e0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2c2f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2c300 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  .  storeLastErrn
2c310 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20  o(pNew, 0);.#if 
2c320 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
2c330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c340 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
2c350 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2c360 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2c370 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20  ;.    h = -1;.  
2c380 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65    osUnlink(zFile
2c390 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  name);.    pNew-
2c3a0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2c3b0 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
2c3c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
2c3d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c3e0 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2c3f0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2c400 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2c410 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
2c420 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
2c430 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
2c440 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
2c450 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69  ;.    verifyDbFi
2c460 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20  le(pNew);.  }.  
2c470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c480 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2c490 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
2c4a0 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
2c4b0 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
2c4c0 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
2c4d0 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
2c4e0 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
2c4f0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
2c500 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
2c510 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2c520 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2c530 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2c540 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
2c550 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
2c560 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
2c570 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
2c580 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
2c590 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22  "/tmp",.     "."
2c5a0 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
2c5b0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2c5c0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
2c5d0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
2c5e0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2c5f0 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21  ectory;..  if( !
2c600 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69  azDirs[0] ) azDi
2c610 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[0] = getenv("
2c620 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b  SQLITE_TMPDIR");
2c630 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
2c640 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
2c650 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
2c660 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
2c670 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
2c680 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
2c690 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
2c6a0 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  ]){.    if( zDir
2c6b0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2c6c0 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a      if( osStat(z
2c6d0 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  Dir, &buf) ) con
2c6e0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
2c6f0 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
2c700 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
2c710 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73  .    if( osAcces
2c720 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f  s(zDir, 07) ) co
2c730 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61  ntinue;.    brea
2c740 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2c750 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  zDir;.}../*.** C
2c760 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
2c770 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
2c780 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
2c790 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
2c7a0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
2c7b0 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
2c7c0 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
2c7d0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
2c7e0 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
2c7f0 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
2c800 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
2c810 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
2c820 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2c830 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2c840 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  r;.  int iLimit 
2c850 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  = 0;..  /* It's 
2c860 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2c870 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2c880 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2c890 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2c8a0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2c8b0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2c8c0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2c8d0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2c8e0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2c8f0 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
2c900 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2c910 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
2c920 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72  IOERR );..  zDir
2c930 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
2c940 69 72 28 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ir();.  do{.    
2c950 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74  u64 r;.    sqlit
2c960 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
2c970 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
2c980 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32    assert( nBuf>2
2c990 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75   );.    zBuf[nBu
2c9a0 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  f-2] = 0;.    sq
2c9b0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2c9c0 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  Buf, zBuf, "%s/"
2c9d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
2c9e0 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c  _PREFIX"%llx%c",
2c9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca00 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30        zDir, r, 0
2ca10 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b  );.    if( zBuf[
2ca20 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69  nBuf-2]!=0 || (i
2ca30 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65  Limit++)>10 ) re
2ca40 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2ca50 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  R;.  }while( osA
2ca60 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
2ca70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2ca80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
2ca90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2caa0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
2cab0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2cac0 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
2cad0 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
2cae0 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
2caf0 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
2cb00 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
2cb10 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
2cb20 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
2cb30 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
2cb40 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
2cb50 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
2cb60 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
2cb70 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
2cb80 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
2cb90 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
2cba0 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
2cbb0 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
2cbc0 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
2cbd0 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2cbe0 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
2cbf0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
2cc00 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
2cc10 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
2cc20 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
2cc30 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
2cc40 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
2cc50 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
2cc60 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
2cc70 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
2cc80 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
2cc90 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
2cca0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2ccb0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
2ccc0 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
2ccd0 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
2cce0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2ccf0 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
2cd00 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
2cd10 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
2cd20 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
2cd30 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
2cd40 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
2cd50 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
2cd60 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
2cd70 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
2cd80 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
2cd90 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
2cda0 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
2cdb0 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
2cdc0 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
2cdd0 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
2cde0 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
2cdf0 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
2ce00 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2ce10 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
2ce20 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
2ce30 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
2ce40 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
2ce50 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
2ce60 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
2ce70 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
2ce80 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
2ce90 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
2cea0 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
2ceb0 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
2cec0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
2ced0 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
2cee0 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
2cef0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
2cf00 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
2cf10 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
2cf20 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
2cf30 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
2cf40 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2cf50 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
2cf60 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
2cf70 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
2cf80 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
2cf90 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
2cfa0 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
2cfb0 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
2cfc0 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
2cfd0 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
2cfe0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
2cff0 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
2d000 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
2d010 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
2d020 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
2d030 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
2d040 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
2d050 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
2d060 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
2d070 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
2d080 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
2d090 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2d0a0 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
2d0b0 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
2d0c0 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
2d0d0 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
2d0e0 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
2d0f0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
2d100 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
2d110 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
2d120 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
2d130 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
2d140 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
2d150 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
2d160 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2d170 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
2d180 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
2d190 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
2d1a0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
2d1b0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
2d1c0 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
2d1d0 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
2d1e0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
2d1f0 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
2d200 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
2d210 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
2d220 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
2d230 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
2d240 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
2d250 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
2d260 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
2d270 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
2d280 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69  or a reusable fi
2d290 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
2d2a0 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a  e not dire.  */.
2d2b0 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
2d2c0 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29  zPath, &sStat) )
2d2d0 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49  {.    unixInodeI
2d2e0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20  nfo *pInode;..  
2d2f0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2d300 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d  ();.    pInode =
2d310 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
2d320 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
2d330 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   (pInode->fileId
2d340 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64  .dev!=sStat.st_d
2d350 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ev.             
2d360 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64          || pInod
2d370 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73  e->fileId.ino!=s
2d380 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a  Stat.st_ino) ){.
2d390 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20         pInode = 
2d3a0 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
2d3b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
2d3c0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69  ode ){.      Uni
2d3d0 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a  xUnusedFd **pp;.
2d3e0 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49        for(pp=&pI
2d3f0 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  node->pUnused; *
2d400 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
2d410 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
2d420 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
2d430 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
2d440 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
2d450 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
2d460 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
2d470 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
2d480 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
2d490 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
2d4a0 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
2d4b0 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
2d4c0 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
2d4d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2d4e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2d4f0 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20  d by unixOpen() 
2d500 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2d510 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e   unix permission
2d520 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e  s.** to create n
2d530 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49  ew files with. I
2d540 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
2d550 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2d560 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
2d570 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69   and a value sui
2d580 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e  table for passin
2d590 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  g as the third a
2d5a0 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28  rgument to open(
2d5b0 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  2) is.** written
2d5c0 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61   to *pMode. If a
2d5d0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2d5e0 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
2d5f0 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
2d600 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2d610 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20  value of *pMode 
2d620 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e  is not modified.
2d630 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63  .**.** In most c
2d640 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ases, this routi
2d650 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  ne sets *pMode t
2d660 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  o 0, which will 
2d670 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64  become.** an ind
2d680 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73  ication to robus
2d690 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61  t_open() to crea
2d6a0 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e  te the file usin
2d6b0 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41  g.** SQLITE_DEFA
2d6c0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2d6d0 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79  IONS adjusted by
2d6e0 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42   the umask..** B
2d6f0 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  ut if the file b
2d700 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
2d710 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
2d720 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2d730 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
2d740 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
2d750 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2d760 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
2d770 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
2d780 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
2d790 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
2d7a0 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
2d7b0 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
2d7c0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
2d7d0 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
2d7e0 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
2d7f0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
2d800 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
2d810 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
2d820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2d830 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
2d840 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
2d850 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
2d860 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
2d870 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
2d880 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
2d890 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
2d8a0 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
2d8b0 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
2d8c0 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
2d8d0 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
2d8e0 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
2d8f0 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
2d900 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
2d910 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2d920 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
2d930 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
2d940 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2d950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2d960 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
2d970 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
2d980 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
2d990 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2d9a0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2d9b0 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
2d9c0 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
2d9d0 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
2d9e0 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2d9f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2da00 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
2da10 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
2da20 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
2da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da40 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74     /* OUT: uid t
2da50 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2da60 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  e */.  gid_t *pG
2da70 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
2da80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
2da90 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2daa0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
2dab0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2dac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2dad0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2dae0 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20    *pMode = 0;.  
2daf0 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47  *pUid = 0;.  *pG
2db00 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c  id = 0;.  if( fl
2db10 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2db20 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2db30 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2db40 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
2db50 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
2db60 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
2db70 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
2db80 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
2db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dba0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2dbb0 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
2dbc0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
2dbd0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
2dbe0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2dbf0 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
2dc00 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2dc10 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
2dc20 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
2dc30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
2dc40 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2dc50 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
2dc60 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
2dc70 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
2dc80 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
2dc90 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
2dca0 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
2dcb0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
2dcc0 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
2dcd0 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
2dce0 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2dcf0 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
2dd00 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2dd10 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
2dd20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2dd30 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20  urnalNN".    ** 
2dd40 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2dd50 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20  walNN".    **.  
2dd60 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73    ** where NN is
2dd70 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65   a decimal numbe
2dd80 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67  r. The NN naming
2dd90 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
2dda0 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
2ddb0 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
2ddc0 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
2ddd0 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
2dde0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2ddf0 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53  ) - 1; .#ifdef S
2de00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
2de10 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65  _NAMES.    while
2de20 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74  ( nDb>0 && sqlit
2de30 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b  e3Isalnum(zPath[
2de40 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20  nDb]) ) nDb--;. 
2de50 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c     if( nDb==0 ||
2de60 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
2de70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2de80 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77  _OK;.#else.    w
2de90 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d  hile( zPath[nDb]
2dea0 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61  !='-' ){.      a
2deb0 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a  ssert( nDb>0 );.
2dec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50        assert( zP
2ded0 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29  ath[nDb]!='\n' )
2dee0 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20  ;.      nDb--;. 
2def0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2df00 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
2df10 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
2df20 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
2df30 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74     if( 0==osStat
2df40 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b  (zDb, &sStat) ){
2df50 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  .      *pMode = 
2df60 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
2df70 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69  0777;.      *pUi
2df80 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64  d = sStat.st_uid
2df90 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20  ;.      *pGid = 
2dfa0 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20  sStat.st_gid;.  
2dfb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2dfc0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2dfd0 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
2dfe0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
2dff0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
2e000 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20  LETEONCLOSE ){. 
2e010 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30     *pMode = 0600
2e020 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2e030 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
2e040 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
2e050 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
2e060 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
2e070 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
2e080 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
2e090 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
2e0a0 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
2e0b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2e0c0 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
2e0d0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
2e0e0 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
2e0f0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
2e100 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
2e110 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
2e120 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
2e130 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
2e140 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
2e150 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
2e160 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
2e170 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
2e180 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
2e190 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
2e1a0 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
2e1b0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
2e1c0 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
2e1d0 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
2e1e0 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
2e1f0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2e200 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
2e210 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
2e220 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
2e230 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
2e240 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
2e250 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
2e260 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
2e270 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
2e280 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
2e290 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
2e2a0 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
2e2b0 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
2e2c0 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
2e2d0 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
2e2e0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
2e2f0 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
2e300 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
2e310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2e320 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
2e330 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2e340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
2e350 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  S for which this
2e360 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65   is the xOpen me
2e370 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
2e380 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2e390 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61         /* Pathna
2e3a0 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
2e3b0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
2e3c0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2e3d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2e3e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e3f0 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e   to be filled in
2e400 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e420 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67     /* Input flag
2e430 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  s to control the
2e440 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   opening */.  in
2e450 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
2e460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2e470 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72  tput flags retur
2e480 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f  ned to SQLite co
2e490 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  re */.){.  unixF
2e4a0 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69  ile *p = (unixFi
2e4b0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
2e4c0 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  t fd = -1;      
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e4e0 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2e4f0 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
2e500 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  () */.  int open
2e510 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
2e520 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
2e530 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
2e540 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  ) */.  int eType
2e550 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
2e560 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
2e570 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2e580 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
2e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5a0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
2e5b0 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
2e5c0 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
2e5d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2e5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
2e5f0 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
2e600 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c   */.  int ctrlFl
2e610 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
2e620 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45       /* UNIXFILE
2e630 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69  _* flags */..  i
2e640 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
2e650 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e660 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
2e670 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
2e680 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
2e690 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2e6a0 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
2e6b0 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
2e6c0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e6d0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
2e6e0 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
2e6f0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
2e700 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e710 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
2e720 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
2e730 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
2e740 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53  EADWRITE);.#if S
2e750 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2e760 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
2e770 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20   isAutoProxy  = 
2e780 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2e790 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b  OPEN_AUTOPROXY);
2e7a0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
2e7b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
2e7c0 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2e7d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2e7e0 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
2e7f0 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Info;.#endif..  
2e800 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
2e810 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d   master or main-
2e820 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  file journal, th
2e830 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
2e840 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c   open.  ** a fil
2e850 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e-descriptor on 
2e860 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
2e870 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  o. The first tim
2e880 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a  e unixSync().  *
2e890 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  * is called the 
2e8a0 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
2e8b0 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
2e8c0 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20  e fsync()ed and 
2e8d0 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20  close()d..  */. 
2e8e0 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28   int syncDir = (
2e8f0 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
2e900 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
2e910 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
2e920 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
2e930 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2e940 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2e950 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
2e960 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2e970 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  .  ));..  /* If 
2e980 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
2e990 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
2e9a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2e9b0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
2e9c0 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
2e9d0 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
2e9e0 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
2e9f0 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
2ea00 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
2ea10 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
2ea20 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f  ATHNAME+2];.  co
2ea30 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
2ea40 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43  = zPath;..  /* C
2ea50 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
2ea60 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
2ea70 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
2ea80 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
2ea90 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
2eaa0 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
2eab0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
2eac0 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
2ead0 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
2eae0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
2eaf0 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
2eb00 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
2eb10 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
2eb20 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
2eb30 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
2eb40 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
2eb50 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
2eb60 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
2eb70 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
2eb80 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
2eb90 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
2eba0 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
2ebb0 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
2ebc0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
2ebd0 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
2ebe0 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
2ebf0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
2ec00 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
2ec10 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
2ec20 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
2ec30 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
2ec40 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
2ec50 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
2ec60 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
2ec70 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
2ec80 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
2ec90 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
2eca0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
2ecb0 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
2ecc0 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
2ecd0 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
2ece0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2ecf0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2ed00 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2ed10 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
2ed20 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2ed30 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2ed40 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2ed50 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
2ed60 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2ed70 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2ed80 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2ed90 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2eda0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
2edb0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2edc0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2edd0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
2ede0 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
2edf0 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
2ee00 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
2ee10 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
2ee20 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
2ee30 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
2ee40 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2ee50 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2ee60 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2ee70 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
2ee80 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2ee90 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
2eea0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2eeb0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
2eec0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
2eed0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
2eee0 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
2eef0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2ef00 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2ef10 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
2ef20 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2ef30 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
2ef40 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2ef50 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  N_WAL.  );..  /*
2ef60 20 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68   Detect a pid ch
2ef70 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74  ange and reset t
2ef80 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20  he PRNG.  There 
2ef90 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
2efa0 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75  ion.  ** here su
2efb0 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d  ch that two or m
2efc0 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ore threads all 
2efd0 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64  trying to open d
2efe0 61 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a  atabases at.  **
2eff0 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e   the same instan
2f000 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65  t might all rese
2f010 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74  t the PRNG.  But
2f020 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73   multiple resets
2f030 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65  .  ** are harmle
2f040 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ss..  */.  if( r
2f050 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73  andomnessPid!=os
2f060 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20  Getpid(0) ){.   
2f070 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
2f080 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20   osGetpid(0);.  
2f090 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
2f0a0 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a  ness(0,0);.  }..
2f0b0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
2f0c0 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
2f0d0 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
2f0e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f0f0 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
2f100 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2f110 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
2f120 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
2f130 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
2f140 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
2f150 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
2f160 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
2f170 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
2f180 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
2f190 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e  oc64(sizeof(*pUn
2f1a0 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
2f1b0 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
2f1c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f1d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2f1e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2f1f0 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
2f200 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62  d;..    /* Datab
2f210 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
2f220 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
2f230 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
2f240 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20   are not.    ** 
2f250 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65  URIs with parame
2f260 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ters.  Hence, th
2f270 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65  ey can always be
2f280 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20   passed into.   
2f290 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
2f2a0 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a  parameter(). */.
2f2b0 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
2f2c0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2f2d0 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73  _URI) || zName[s
2f2e0 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
2f2f0 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69  =0 );..  }else i
2f300 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
2f310 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2f320 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20  NULL, the upper 
2f330 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74  layer is request
2f340 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
2f350 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69   */.    assert(i
2f360 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63  sDelete && !sync
2f370 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  Dir);.    rc = u
2f380 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  nixGetTempname(p
2f390 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
2f3a0 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
2f3b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f3c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2f3d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2f3e0 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
2f3f0 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
2f400 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ted temporary fi
2f410 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61  lenames are alwa
2f420 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  ys double-zero t
2f430 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a  erminated.    **
2f440 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69   for use by sqli
2f450 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
2f460 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
2f470 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e  rt( zName[strlen
2f480 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
2f490 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
2f4a0 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f  mine the value o
2f4b0 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  f the flags para
2f4c0 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
2f4d0 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20  POSIX function. 
2f4e0 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73   ** open(). Thes
2f4f0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c  e must be calcul
2f500 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65  ated even if ope
2f510 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2f520 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20  d, as.  ** they 
2f530 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
2f540 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
2f550 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65  e handle and use
2f560 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27  d by the .  ** '
2f570 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b  conch file' lock
2f580 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61  ing functions la
2f590 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66  ter on.  */.  if
2f5a0 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
2f5b0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
2f5c0 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
2f5d0 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46  eadWrite ) openF
2f5e0 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
2f5f0 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
2f600 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
2f610 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20   O_CREAT;.  if( 
2f620 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70  isExclusive ) op
2f630 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58  enFlags |= (O_EX
2f640 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
2f650 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28    openFlags |= (
2f660 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
2f670 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64  NARY);..  if( fd
2f680 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74  <0 ){.    mode_t
2f690 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
2f6a0 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69          /* Permi
2f6b0 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ssions to create
2f6c0 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
2f6d0 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20    uid_t uid;    
2f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6f0 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68  /* Userid for th
2f700 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69  e file */.    gi
2f710 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20  d_t gid;        
2f720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
2f730 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66  roupid for the f
2f740 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ile */.    rc = 
2f750 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
2f760 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  de(zName, flags,
2f770 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64   &openMode, &uid
2f780 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28  , &gid);.    if(
2f790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f7a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2f7b0 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20  !p->pUnused );. 
2f7c0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
2f7d0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2f7e0 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  WAL || eType==SQ
2f7f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2f800 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20  OURNAL );.      
2f810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2f820 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
2f830 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
2f840 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
2f850 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
2f860 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
2f870 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
2f880 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b  me, openFlags));
2f890 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
2f8a0 45 78 63 6c 75 73 69 76 65 20 7c 7c 20 28 6f 70  Exclusive || (op
2f8b0 65 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52 45 41  enFlags & O_CREA
2f8c0 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  T)!=0 );.    if(
2f8d0 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d   fd<0 && errno!=
2f8e0 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64  EISDIR && isRead
2f8f0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  Write ){.      /
2f900 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
2f910 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
2f920 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
2f930 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
2f940 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26  */.      flags &
2f950 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
2f960 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
2f970 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
2f980 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26       openFlags &
2f990 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  = ~(O_RDWR|O_CRE
2f9a0 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  AT);.      flags
2f9b0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
2f9c0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
2f9d0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
2f9e0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52  DONLY;.      isR
2f9f0 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
2fa00 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2fa10 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
2fa20 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
2fa30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
2fa40 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  d<0 ){.      rc 
2fa50 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
2fa60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2fa70 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61  KPT, "open", zNa
2fa80 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
2fa90 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
2faa0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2fab0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
2fac0 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20  running as root 
2fad0 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67 20  and if creating 
2fae0 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20  a new rollback. 
2faf0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72     ** journal or
2fb00 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20 74   WAL file, set t
2fb10 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  he ownership of 
2fb20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57  the journal or W
2fb30 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  AL to be.    ** 
2fb40 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2fb50 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
2fb60 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2fb70 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
2fb80 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
2fb90 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2fba0 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 72 6f  NAL) ){.      ro
2fbb0 62 75 73 74 46 63 68 6f 77 6e 28 66 64 2c 20 75  bustFchown(fd, u
2fbc0 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a  id, gid);.    }.
2fbd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
2fbe0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
2fbf0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
2fc00 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
2fc10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
2fc20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  pUnused ){.    p
2fc30 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20  ->pUnused->fd = 
2fc40 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73  fd;.    p->pUnus
2fc50 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
2fc60 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
2fc70 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
2fc80 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
2fc90 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69  th = zName;.#eli
2fca0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2fcb0 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c  _UNLINK_AFTER_CL
2fcc0 4f 53 45 29 0a 20 20 20 20 7a 50 61 74 68 20 3d  OSE).    zPath =
2fcd0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2fce0 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ("%s", zName);. 
2fcf0 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20     if( zPath==0 
2fd00 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  ){.      robust_
2fd10 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
2fd20 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65  INE__);.      re
2fd30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2fd40 4d 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  M;.    }.#else. 
2fd50 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d     osUnlink(zNam
2fd60 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
2fd70 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2fd80 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2fd90 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70   else{.    p->op
2fda0 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
2fdb0 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
2fdc0 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70  .  noLock = eTyp
2fdd0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2fde0 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20  AIN_DB;..  .#if 
2fdf0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2fe00 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
2fe10 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2fe20 45 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28  E.  if( fstatfs(
2fe30 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  fd, &fsInfo) == 
2fe40 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  -1 ){.    storeL
2fe50 61 73 74 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e  astErrno(p, errn
2fe60 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  o);.    robust_c
2fe70 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
2fe80 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
2fe90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2fea0 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
2feb0 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
2fec0 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
2fed0 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
2fee0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2fef0 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
2ff00 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
2ff10 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
2ff20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72  }.  if (0 == str
2ff30 6e 63 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73  ncmp("exfat", fs
2ff40 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
2ff50 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75  e, 5)) {.    ((u
2ff60 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
2ff70 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  >fsFlags |= SQLI
2ff80 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
2ff90 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  DOS;.  }.#endif.
2ffa0 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70  .  /* Set up app
2ffb0 72 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61  ropriate ctrlFla
2ffc0 67 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65  gs */.  if( isDe
2ffd0 6c 65 74 65 20 29 20 20 20 20 20 20 20 20 20 20  lete )          
2ffe0 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
2fff0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45  |= UNIXFILE_DELE
30000 54 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  TE;.  if( isRead
30010 6f 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20 20  only )          
30020 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
30030 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
30040 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29  ;.  if( noLock )
30050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30060 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
30070 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a  NIXFILE_NOLOCK;.
30080 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 20    if( syncDir ) 
30090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300a0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
300b0 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
300c0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
300d0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63  ITE_OPEN_URI ) c
300e0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
300f0 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53  FILE_URI;..#if S
30100 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
30110 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53  KING_STYLE.#if S
30120 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
30130 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41  XY_LOCKING.  isA
30140 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65  utoProxy = 1;.#e
30150 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74  ndif.  if( isAut
30160 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68  oProxy && (zPath
30170 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c  !=NULL) && (!noL
30180 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f  ock) && pVfs->xO
30190 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  pen ){.    char 
301a0 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65  *envforce = gete
301b0 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45  nv("SQLITE_FORCE
301c0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29  _PROXY_LOCKING")
301d0 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f  ;.    int usePro
301e0 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  xy = 0;..    /* 
301f0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
30200 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65  XY_LOCKING==1 me
30210 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73  ans force always
30220 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65   use proxy, 0 me
30230 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65  ans .    ** neve
30240 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c  r use proxy, NUL
30250 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78  L means use prox
30260 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  y for non-local 
30270 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a  files only.  */.
30280 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65      if( envforce
30290 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
302a0 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28  useProxy = atoi(
302b0 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20  envforce)>0;.   
302c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 73   }else{.      us
302d0 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66  eProxy = !(fsInf
302e0 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f  o.f_flags&MNT_LO
302f0 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CAL);.    }.    
30300 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a  if( useProxy ){.
30310 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49        rc = fillI
30320 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
30330 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
30340 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  , ctrlFlags);.  
30350 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30370 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73   rc = proxyTrans
30380 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e  formUnixFile((un
30390 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22  ixFile*)pFile, "
303a0 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20  :auto:");.      
303b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
303c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
303d0 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73   /* Use unixClos
303e0 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  e to clean up th
303f0 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65  e resources adde
30400 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46  d in fillInUnixF
30410 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ile .          *
30420 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20  * and clear all 
30430 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20  the structure's 
30440 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65  references.  Spe
30450 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20  cifically, .    
30460 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e        ** pFile->
30470 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65  pMethods will be
30480 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33   NULL so sqlite3
30490 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20  OsClose will be 
304a0 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20  a no-op .       
304b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
304c0 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29  unixClose(pFile)
304d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
304e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
304f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
30500 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
30510 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  d;.    }.  }.#en
30520 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  dif.  .  rc = fi
30530 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
30540 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  s, fd, pFile, zP
30550 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b  ath, ctrlFlags);
30560 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ..open_finished:
30570 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
30580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
30590 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75  te3_free(p->pUnu
305a0 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
305b0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
305c0 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
305d0 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
305e0 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
305f0 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
30600 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
30610 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
30620 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
30630 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
30640 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
30650 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
30660 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
30670 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
30680 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
30690 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
306a0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
306b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
306c0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
306d0 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
306e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
306f0 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
30700 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
30710 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
30720 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
30730 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
30740 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
30750 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
30760 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
30770 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
30780 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55  LETE);.  if( osU
30790 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d  nlink(zPath)==(-
307a0 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72  1) ){.    if( er
307b0 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69 66 20  rno==ENOENT.#if 
307c0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20  OS_VXWORKS.     
307d0 20 20 20 7c 7c 20 6f 73 41 63 63 65 73 73 28 7a     || osAccess(z
307e0 50 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e 64 69  Path,0)!=0.#endi
307f0 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  f.    ){.      r
30800 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
30810 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20  _DELETE_NOENT;. 
30820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30830 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
30840 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
30850 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c  ELETE, "unlink",
30860 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
30870 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30880 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
30890 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
308a0 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e 63 20  .  if( (dirSync 
308b0 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  & 1)!=0 ){.    i
308c0 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20  nt fd;.    rc = 
308d0 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
308e0 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20  zPath, &fd);.   
308f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30900 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  OK ){.#if OS_VXW
30910 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66  ORKS.      if( f
30920 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23  sync(fd)==-1 ).#
30930 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66  else.      if( f
30940 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69  sync(fd) ).#endi
30950 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
30960 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
30970 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
30980 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79  _DIR_FSYNC, "fsy
30990 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  nc", zPath);.   
309a0 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73     }.      robus
309b0 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f  t_close(0, fd, _
309c0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65  _LINE__);.    }e
309d0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
309e0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  t( rc==SQLITE_CA
309f0 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20  NTOPEN );.      
30a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
30a10 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
30a20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30a30 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  ./*.** Test the 
30a40 65 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20  existence of or 
30a50 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
30a60 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68  ns of file zPath
30a70 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65  . The.** test pe
30a80 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20  rformed depends 
30a90 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
30aa0 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
30ab0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
30ac0 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20  XISTS: Return 1 
30ad0 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  if the file exis
30ae0 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ts.**     SQLITE
30af0 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
30b00 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  E: Return 1 if t
30b10 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20  he file is read 
30b20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a  and writable..**
30b30 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
30b40 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74  SS_READONLY: Ret
30b50 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
30b60 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a  e is readable..*
30b70 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72  *.** Otherwise r
30b80 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
30b90 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73  ic int unixAcces
30ba0 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
30bb0 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20   *NotUsed,   /* 
30bc0 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69  The VFS containi
30bd0 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20  ng this xAccess 
30be0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
30bf0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
30c00 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74      /* Path of t
30c10 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69  he file to exami
30c20 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ne */.  int flag
30c30 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
30c40 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61  /* What do we wa
30c50 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75  nt to learn abou
30c60 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65  t the zPath file
30c70 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  ? */.  int *pRes
30c80 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Out            /
30c90 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62  * Write result b
30ca0 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29  oolean here */.)
30cb0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
30cc0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
30cd0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
30ce0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
30cf0 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
30d00 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 4f  .  assert( pResO
30d10 75 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54  ut!=0 );..  /* T
30d20 68 65 20 73 70 65 63 20 73 61 79 73 20 74 68 65  he spec says the
30d30 72 65 20 61 72 65 20 74 68 72 65 65 20 70 6f 73  re are three pos
30d40 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72  sible values for
30d50 20 66 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c   flags.  But onl
30d60 79 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68  y.  ** two of th
30d70 65 6d 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  em are actually 
30d80 75 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  used */.  assert
30d90 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ( flags==SQLITE_
30da0 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 7c 7c  ACCESS_EXISTS ||
30db0 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
30dc0 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 20  CCESS_READWRITE 
30dd0 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 3d  );..  if( flags=
30de0 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
30df0 58 49 53 54 53 20 29 7b 0a 20 20 20 20 73 74 72  XISTS ){.    str
30e00 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
30e10 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 30 3d    *pResOut = (0=
30e20 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26  =osStat(zPath, &
30e30 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73  buf) && buf.st_s
30e40 69 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ize>0);.  }else{
30e50 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
30e60 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20  osAccess(zPath, 
30e70 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20  W_OK|R_OK)==0;. 
30e80 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
30e90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
30ea0 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
30eb0 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
30ec0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
30ed0 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  The relative pat
30ee0 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61  h.** is stored a
30ef0 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
30f00 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ed string in the
30f10 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
30f20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20  to by.** zPath. 
30f30 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e  .**.** zOut poin
30f40 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  ts to a buffer o
30f50 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74  f at least sqlit
30f60 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
30f70 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20  e bytes .** (in 
30f80 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50  this case, MAX_P
30f90 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20  ATHNAME bytes). 
30fa0 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73  The full-path is
30fb0 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74   written to.** t
30fc0 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72  his buffer befor
30fd0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
30fe0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
30ff0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
31000 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
31010 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
31020 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
31030 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
31040 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
31050 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
31060 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
31070 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
31080 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
31090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
310a0 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
310b0 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
310c0 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310e0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
310f0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  r */.){.  int nB
31100 79 74 65 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  yte;..  /* It's 
31110 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
31120 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
31130 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
31140 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
31150 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
31160 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
31170 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
31180 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
31190 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
311a0 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
311b0 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
311c0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
311d0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
311e0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
311f0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
31200 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
31210 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
31220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
31230 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72  RROR );..  asser
31240 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t( pVfs->mxPathn
31250 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d  ame==MAX_PATHNAM
31260 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  E );.  UNUSED_PA
31270 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
31280 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
31290 72 65 73 6f 6c 76 65 20 74 68 65 20 70 61 74 68  resolve the path
312a0 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20 61   as if it were a
312b0 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2e 20   symbolic link. 
312c0 49 66 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 20  If it is.  ** a 
312d0 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2c 20 74  symbolic link, t
312e0 68 65 20 72 65 73 6f 6c 76 65 64 20 70 61 74 68  he resolved path
312f0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 62 75   is stored in bu
31300 66 66 65 72 20 7a 4f 75 74 5b 5d 2e 20 4f 72 2c  ffer zOut[]. Or,
31310 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 69 64 65   if.  ** the ide
31320 6e 74 69 66 69 65 64 20 66 69 6c 65 20 69 73 20  ntified file is 
31330 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c  not a symbolic l
31340 69 6e 6b 20 6f 72 20 64 6f 65 73 20 6e 6f 74 20  ink or does not 
31350 65 78 69 73 74 2c 20 74 68 65 6e 0a 20 20 2a 2a  exist, then.  **
31360 20 7a 50 61 74 68 20 69 73 20 63 6f 70 69 65 64   zPath is copied
31370 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 7a   directly into z
31380 4f 75 74 2e 20 45 69 74 68 65 72 20 77 61 79 2c  Out. Either way,
31390 20 6e 42 79 74 65 20 69 73 20 6c 65 66 74 20 73   nByte is left s
313a0 65 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73  et to.  ** the s
313b0 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 69 6e  ize of the strin
313c0 67 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 7a 4f  g copied into zO
313d0 75 74 5b 5d 20 69 6e 20 62 79 74 65 73 2e 20 20  ut[] in bytes.  
313e0 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 52  */.  nByte = osR
313f0 65 61 64 6c 69 6e 6b 28 7a 50 61 74 68 2c 20 7a  eadlink(zPath, z
31400 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20  Out, nOut-1);.  
31410 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20  if( nByte<0 ){. 
31420 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 49     if( errno!=EI
31430 4e 56 41 4c 20 26 26 20 65 72 72 6e 6f 21 3d 45  NVAL && errno!=E
31440 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72  NOENT ){.      r
31450 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
31460 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
31470 45 4e 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c 69  EN_BKPT, "readli
31480 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  nk", zPath);.   
31490 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
314a0 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
314b0 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29  ut, "%s", zPath)
314c0 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 71  ;.    nByte = sq
314d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
314e0 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
314f0 20 20 7a 4f 75 74 5b 6e 42 79 74 65 5d 20 3d 20    zOut[nByte] = 
31500 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  '\0';.  }..  /* 
31510 49 66 20 62 75 66 66 65 72 20 7a 4f 75 74 5b 5d  If buffer zOut[]
31520 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 61 6e   now contains an
31530 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 74   absolute path t
31540 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
31550 6d 6f 72 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 2e  more.  ** to do.
31560 20 49 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   If it contains 
31570 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c  a relative path,
31580 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
31590 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  g:.  **.  **   *
315a0 20 6d 6f 76 65 20 74 68 65 20 72 65 6c 61 74 69   move the relati
315b0 76 65 20 70 61 74 68 20 73 74 72 69 6e 67 20 73  ve path string s
315c0 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
315d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 0a 20 20  the end of th.  
315e0 2a 2a 20 20 20 20 20 7a 4f 75 74 5b 5d 20 62 75  **     zOut[] bu
315f0 66 66 65 72 2e 0a 20 20 2a 2a 20 20 20 2a 20 43  ffer..  **   * C
31600 61 6c 6c 20 67 65 74 63 77 64 28 29 20 74 6f 20  all getcwd() to 
31610 72 65 61 64 20 74 68 65 20 70 61 74 68 20 6f 66  read the path of
31620 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 6f 72   the current wor
31630 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 0a  king directory .
31640 20 20 2a 2a 20 20 20 20 20 69 6e 74 6f 20 74 68    **     into th
31650 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 7a  e start of the z
31660 4f 75 74 5b 5d 20 62 75 66 66 65 72 2e 0a 20 20  Out[] buffer..  
31670 2a 2a 20 20 20 2a 20 41 70 70 65 6e 64 20 61 20  **   * Append a 
31680 27 2f 27 20 63 68 61 72 61 63 74 65 72 20 74 6f  '/' character to
31690 20 74 68 65 20 63 77 64 20 73 74 72 69 6e 67 20   the cwd string 
316a0 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 0a 20 20  and move the .  
316b0 2a 2a 20 20 20 20 20 72 65 6c 61 74 69 76 65 20  **     relative 
316c0 70 61 74 68 20 62 61 63 6b 20 77 69 74 68 69 6e  path back within
316d0 20 74 68 65 20 62 75 66 66 65 72 20 73 6f 20 74   the buffer so t
316e0 68 61 74 20 69 74 20 69 6d 6d 65 64 69 61 74 65  hat it immediate
316f0 6c 79 20 0a 20 20 2a 2a 20 20 20 20 20 66 6f 6c  ly .  **     fol
31700 6c 6f 77 73 20 74 68 65 20 27 2f 27 2e 0a 20 20  lows the '/'..  
31710 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64  **.  ** This cod
31720 65 20 69 73 20 77 72 69 74 74 65 6e 20 73 6f 20  e is written so 
31730 74 68 61 74 20 69 66 20 74 68 65 20 63 6f 6d 62  that if the comb
31740 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 43  ination of the C
31750 57 44 20 61 6e 64 20 72 65 6c 61 74 69 76 65 0a  WD and relative.
31760 20 20 2a 2a 20 70 61 74 68 20 61 72 65 20 6c 61    ** path are la
31770 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 61 6c  rger than the al
31780 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
31790 7a 4f 75 74 5b 5d 20 74 68 65 20 43 57 44 20 69  zOut[] the CWD i
317a0 73 20 73 69 6c 65 6e 74 6c 79 0a 20 20 2a 2a 20  s silently.  ** 
317b0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 6d 61 6b  truncated to mak
317c0 65 20 69 74 20 66 69 74 2e 20 54 68 69 73 20 69  e it fit. This i
317d0 73 20 4f 6b 2c 20 61 73 20 53 51 4c 69 74 65 20  s Ok, as SQLite 
317e0 72 65 66 75 73 65 73 20 74 6f 20 6f 70 65 6e 20  refuses to open 
317f0 61 6e 79 0a 20 20 2a 2a 20 66 69 6c 65 20 66 6f  any.  ** file fo
31800 72 20 77 68 69 63 68 20 74 68 69 73 20 66 75 6e  r which this fun
31810 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
31820 66 75 6c 6c 20 70 61 74 68 20 6c 61 72 67 65 72  full path larger
31830 20 74 68 61 6e 20 28 6e 4f 75 74 2d 38 29 0a 20   than (nOut-8). 
31840 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
31850 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 7a 4f 75  e.  */.  if( zOu
31860 74 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  t[0]!='/' ){.   
31870 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69   int nCwd;.    i
31880 6e 74 20 6e 52 65 6d 20 3d 20 6e 4f 75 74 2d 6e  nt nRem = nOut-n
31890 42 79 74 65 2d 31 3b 0a 20 20 20 20 6d 65 6d 6d  Byte-1;.    memm
318a0 6f 76 65 28 26 7a 4f 75 74 5b 6e 52 65 6d 5d 2c  ove(&zOut[nRem],
318b0 20 7a 4f 75 74 2c 20 6e 42 79 74 65 2b 31 29 3b   zOut, nByte+1);
318c0 0a 20 20 20 20 7a 4f 75 74 5b 6e 52 65 6d 2d 31  .    zOut[nRem-1
318d0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 69 66  ] = '\0';.    if
318e0 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c  ( osGetcwd(zOut,
318f0 20 6e 52 65 6d 2d 31 29 3d 3d 30 20 29 7b 0a 20   nRem-1)==0 ){. 
31900 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
31910 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
31920 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
31930 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b  getcwd", zPath);
31940 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20  .    }.    nCwd 
31950 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
31960 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 61 73 73  0(zOut);.    ass
31970 65 72 74 28 20 6e 43 77 64 3c 3d 6e 52 65 6d 2d  ert( nCwd<=nRem-
31980 31 20 29 3b 0a 20 20 20 20 7a 4f 75 74 5b 6e 43  1 );.    zOut[nC
31990 77 64 5d 20 3d 20 27 2f 27 3b 0a 20 20 20 20 6d  wd] = '/';.    m
319a0 65 6d 6d 6f 76 65 28 26 7a 4f 75 74 5b 6e 43 77  emmove(&zOut[nCw
319b0 64 2b 31 5d 2c 20 26 7a 4f 75 74 5b 6e 52 65 6d  d+1], &zOut[nRem
319c0 5d 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 7d  ], nByte+1);.  }
319d0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
319e0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  E_OK;.}...#ifnde
319f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
31a00 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
31a10 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
31a20 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
31a30 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
31a40 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
31a50 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
31a60 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
31a70 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
31a80 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
31a90 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
31aa0 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
31ab0 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c   *unixDlOpen(sql
31ac0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
31ad0 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
31ae0 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55  Filename){.  UNU
31af0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31b00 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
31b10 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   dlopen(zFilenam
31b20 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54  e, RTLD_NOW | RT
31b30 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f  LD_GLOBAL);.}../
31b40 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c  *.** SQLite call
31b50 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
31b60 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
31b70 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  r a call to unix
31b80 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e  DlSym() or.** un
31b90 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73  ixDlOpen() fails
31ba0 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c   (returns a null
31bb0 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20   pointer). If a 
31bc0 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72  more detailed er
31bd0 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
31be0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20  s available, it 
31bf0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42  is written to zB
31c00 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72  ufOut. If no err
31c10 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73  or message.** is
31c20 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66   available, zBuf
31c30 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  Out is left unmo
31c40 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74  dified and SQLit
31c50 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74  e uses a default
31c60 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
31c70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
31c80 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71  d unixDlError(sq
31c90 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
31ca0 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
31cb0 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
31cc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
31cd0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
31ce0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31cf0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
31d00 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72  );.  zErr = dler
31d10 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72  ror();.  if( zEr
31d20 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
31d30 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
31d40 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a  zBufOut, "%s", z
31d50 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  Err);.  }.  unix
31d60 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
31d70 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e  static void (*un
31d80 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  ixDlSym(sqlite3_
31d90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
31da0 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
31db0 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a  r*zSym))(void){.
31dc0 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77    /* .  ** GCC w
31dd0 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
31de0 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43  rors says that C
31df0 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  90 does not allo
31e00 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a  w a void* to be.
31e10 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61    ** cast into a
31e20 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
31e30 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74  nction.  And yet
31e40 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73   the library dls
31e50 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a  ym() routine.  *
31e60 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64  * returns a void
31e70 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c  * which is reall
31e80 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
31e90 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68   function.  So h
31ea0 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73  ow do we.  ** us
31eb0 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d  e dlsym() with -
31ec0 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f  pedantic-errors?
31ed0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  **.  ** Varia
31ee0 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64  ble x below is d
31ef0 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  efined to be a p
31f00 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
31f10 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a  tion taking.  **
31f20 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64   parameters void
31f30 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72  * and const char
31f40 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  * and returning 
31f50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
31f60 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65  unction..  ** We
31f70 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79   initialize x by
31f80 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
31f90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
31fa0 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lsym() function.
31fb0 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69  .  ** (That assi
31fc0 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20  gnment requires 
31fd0 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77  a cast.)  Then w
31fe0 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74  e call the funct
31ff0 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20  ion that.  ** x 
32000 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a  points to.  .  *
32010 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b  *.  ** This work
32020 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b  -around is unlik
32030 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72  ely to work corr
32040 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73  ectly on any sys
32050 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79  tem where.  ** y
32060 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74  ou really cannot
32070 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e   cast a function
32080 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f   pointer into vo
32090 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20  id*.  But then, 
320a0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  on the.  ** othe
320b0 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20  r hand, dlsym() 
320c0 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  will not work on
320d0 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65   such a system e
320e0 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76  ither, so we hav
320f0 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c  e.  ** not reall
32100 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e  y lost anything.
32110 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28  .  */.  void (*(
32120 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  *x)(void*,const 
32130 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20  char*))(void);. 
32140 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
32150 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20  R(NotUsed);.  x 
32160 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69  = (void(*(*)(voi
32170 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
32180 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20  (void))dlsym;.  
32190 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a  return (*x)(p, z
321a0 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Sym);.}.static v
321b0 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28  oid unixDlClose(
321c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
321d0 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e  Used, void *pHan
321e0 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
321f0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32200 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61  );.  dlclose(pHa
32210 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  ndle);.}.#else /
32220 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
32230 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
32240 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
32250 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f   #define unixDlO
32260 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
32270 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20   unixDlError 0. 
32280 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53   #define unixDlS
32290 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
322a0 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23   unixDlClose 0.#
322b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
322c0 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
322d0 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20   random data to 
322e0 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
322f0 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer zBuf..*/.sta
32300 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64  tic int unixRand
32310 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
32320 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
32330 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
32340 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
32350 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
32360 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f  .  assert((size_
32370 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28  t)nBuf>=(sizeof(
32380 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69  time_t)+sizeof(i
32390 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  nt)));..  /* We 
323a0 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  have to initiali
323b0 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65  ze zBuf to preve
323c0 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  nt valgrind from
323d0 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20   reporting.  ** 
323e0 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70  errors.  The rep
323f0 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76  orts issued by v
32400 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f  algrind are inco
32410 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64  rrect - we would
32420 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61  .  ** prefer tha
32430 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  t the randomness
32440 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79   be increased by
32450 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74   making use of t
32460 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61  he.  ** uninitia
32470 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a  lized space in z
32480 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69  Buf - but valgri
32490 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74  nd errors tend t
324a0 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d  o worry.  ** som
324b0 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72  e users.  Rather
324c0 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20   than argue, it 
324d0 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73  seems easier jus
324e0 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
324f0 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61    ** the whole a
32500 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65  rray and silence
32510 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20   valgrind, even 
32520 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65  if that means le
32530 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20  ss randomness.  
32540 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d  ** in the random
32550 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   seed..  **.  **
32560 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69   When testing, i
32570 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66  nitializing zBuf
32580 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c  [] to zero is al
32590 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d  l we do.  That m
325a0 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  eans.  ** that w
325b0 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
325c0 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d   same random num
325d0 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ber sequence.  T
325e0 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20  his makes the.  
325f0 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61  ** tests repeata
32600 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  ble..  */.  mems
32610 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
32620 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50  );.  randomnessP
32630 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29  id = osGetpid(0)
32640 3b 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ;  .#if !defined
32650 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
32660 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
32670 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53  _OMIT_RANDOMNESS
32680 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 66 64  ).  {.    int fd
32690 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20  , got;.    fd = 
326a0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65  robust_open("/de
326b0 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
326c0 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  ONLY, 0);.    if
326d0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
326e0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
326f0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
32700 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
32710 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
32720 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
32730 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61 6e  sizeof(t)], &ran
32740 64 6f 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a 65  domnessPid, size
32750 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  of(randomnessPid
32760 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
32770 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65  ( sizeof(t)+size
32780 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  of(randomnessPid
32790 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  )<=(size_t)nBuf 
327a0 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
327b0 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
327c0 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  of(randomnessPid
327d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
327e0 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73      do{ got = os
327f0 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e  Read(fd, zBuf, n
32800 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  Buf); }while( go
32810 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
32820 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62  NTR );.      rob
32830 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
32840 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
32850 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
32860 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a  eturn nBuf;.}...
32870 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
32880 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
32890 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
328a0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
328b0 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
328c0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
328d0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
328e0 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
328f0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
32900 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
32910 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
32920 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
32930 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
32940 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
32950 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
32960 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
32970 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
32980 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
32990 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
329a0 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
329b0 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
329c0 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
329d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
329e0 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
329f0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
32a00 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23  microseconds){.#
32a10 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
32a20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
32a30 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63  sp;..  sp.tv_sec
32a40 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20   = microseconds 
32a50 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e  / 1000000;.  sp.
32a60 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f  tv_nsec = (micro
32a70 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30  seconds % 100000
32a80 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e  0) * 1000;.  nan
32a90 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c  osleep(&sp, NULL
32aa0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
32ab0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32ac0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
32ad0 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66  conds;.#elif def
32ae0 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
32af0 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
32b00 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73  .  usleep(micros
32b10 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
32b20 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32b30 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
32b40 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
32b50 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73  se.  int seconds
32b60 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
32b70 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30  +999999)/1000000
32b80 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64  ;.  sleep(second
32b90 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
32ba0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
32bb0 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64  .  return second
32bc0 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69  s*1000000;.#endi
32bd0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
32be0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
32bf0 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
32c00 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
32c10 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
32c20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
32c30 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
32c40 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
32c50 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
32c60 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
32c70 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
32c80 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
32c90 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
32ca0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
32cb0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
32cc0 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
32cd0 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
32ce0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
32cf0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
32d00 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
32d10 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
32d20 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
32d30 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
32d40 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
32d50 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
32d60 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
32d70 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
32d80 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
32d90 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
32da0 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
32db0 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
32dc0 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
32dd0 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
32de0 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
32df0 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
32e00 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
32e10 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
32e20 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
32e30 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
32e40 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
32e50 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
32e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
32e70 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   Return SQLITE_E
32e80 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65  RROR if the time
32e90 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61   and date .** ca
32ea0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
32eb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
32ec0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
32ed0 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  4(sqlite3_vfs *N
32ee0 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f  otUsed, sqlite3_
32ef0 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
32f00 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
32f10 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
32f20 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
32f30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
32f40 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72  8640000;.  int r
32f50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
32f60 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45  if defined(NO_GE
32f70 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74  TTOD).  time_t t
32f80 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20  ;.  time(&t);.  
32f90 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74  *piNow = ((sqlit
32fa0 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30  e3_int64)t)*1000
32fb0 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65   + unixEpoch;.#e
32fc0 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  lif OS_VXWORKS. 
32fd0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
32fe0 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67   sNow;.  clock_g
32ff0 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41  ettime(CLOCK_REA
33000 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20  LTIME, &sNow);. 
33010 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
33020 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
33030 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
33040 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
33050 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65  nsec/1000000;.#e
33060 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d  lse.  struct tim
33070 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76 6f  eval sNow;.  (vo
33080 69 64 29 67 65 74 74 69 6d 65 6f 66 64 61 79 28  id)gettimeofday(
33090 26 73 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20 43  &sNow, 0);  /* C
330a0 61 6e 6e 6f 74 20 66 61 69 6c 20 67 69 76 65 6e  annot fail given
330b0 20 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73   valid arguments
330c0 20 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75   */.  *piNow = u
330d0 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
330e0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
330f0 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
33100 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a  w.tv_usec/1000;.
33110 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
33120 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
33130 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
33140 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
33150 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
33160 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
33170 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
33180 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
33190 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
331a0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
331b0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
331c0 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a 20 4e 6f 74  .}..#if 0 /* Not
331d0 20 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 46   used */./*.** F
331e0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
331f0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
33200 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
33210 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
33220 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
33230 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
33240 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
33250 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
33260 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
33270 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
33280 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
33290 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
332a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
332b0 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
332c0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
332d0 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
332e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
332f0 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 i = 0;.  int r
33300 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
33310 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33320 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65    rc = unixCurre
33330 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26  ntTimeInt64(0, &
33340 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69  i);.  *prNow = i
33350 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72  /86400000.0;.  r
33360 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
33370 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 43  e.# define unixC
33380 75 72 72 65 6e 74 54 69 6d 65 20 30 0a 23 65 6e  urrentTime 0.#en
33390 64 69 66 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e  dif..#if 0  /* N
333a0 6f 74 20 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a  ot used */./*.**
333b0 20 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47   We added the xG
333c0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65  etLastError() me
333d0 74 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e  thod with the in
333e0 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69  tention of provi
333f0 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c  ding.** better l
33400 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d  ow-level error m
33410 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65  essages when ope
33420 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72  rating-system pr
33430 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a  oblems come up.*
33440 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20  * during SQLite 
33450 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
33460 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20  so far, none of 
33470 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d  that has been im
33480 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20  plemented.** in 
33490 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68  the core.  So th
334a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
334b0 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72  ver called.  For
334c0 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65   now, it is mere
334d0 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f  ly.** a place-ho
334e0 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lder..*/.static 
334f0 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45  int unixGetLastE
33500 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
33510 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
33520 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e  otUsed2, char *N
33530 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53  otUsed3){.  UNUS
33540 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
33550 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Used);.  UNUSED_
33560 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
33570 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2);.  UNUSED_PA
33580 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33  RAMETER(NotUsed3
33590 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
335a0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
335b0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
335c0 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
335d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
335e0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73  ******* End of s
335f0 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
33600 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
33610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
33620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
33670 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
33680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
336c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
336e0 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a   Proxy Locking *
336f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
33710 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  **.** Proxy lock
33720 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c  ing is a "uber-l
33730 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69  ocking-method" i
33740 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49  n this sense:  I
33750 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74  t uses the.** ot
33760 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  her locking meth
33770 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79  ods on secondary
33780 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72   lock files.  Pr
33790 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
337a0 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f  .** meta-layer o
337b0 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70  ver top of the p
337c0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
337d0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
337e0 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73  ve.  For.** this
337f0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
33800 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
33810 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c  ments of proxy l
33820 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ocking is deferr
33830 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65  ed.** until late
33840 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65   in the file (he
33850 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  re) after all of
33860 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d   the other I/O m
33870 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62  ethods have.** b
33880 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f  een defined - so
33890 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74   that the primit
338a0 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ive locking meth
338b0 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ods are availabl
338c0 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73  e.** as services
338d0 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68   to help with th
338e0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
338f0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
33900 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  g..**.****.**.**
33910 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   The default loc
33920 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20  king schemes in 
33930 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d  SQLite use byte-
33940 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  range locks on t
33950 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
33960 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  ile to coordinat
33970 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65  e safe, concurre
33980 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  nt access by mul
33990 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a  tiple readers.**
339a0 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74   and writers [ht
339b0 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
339c0 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e  lockingv3.html].
339d0 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20    The five file 
339e0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65  locking.** state
339f0 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e  s (UNLOCKED, PEN
33a00 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45  DING, SHARED, RE
33a10 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56  SERVED, EXCLUSIV
33a20 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  E) are implement
33a30 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72  ed.** as POSIX r
33a40 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b  ead & write lock
33a50 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74  s over fixed set
33a60 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76   of locations (v
33a70 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e  ia fsctl),.** on
33a80 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c   AFP and SMB onl
33a90 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  y exclusive byte
33aa0 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
33ab0 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66   available via f
33ac0 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f  sctl.** with _IO
33ad0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
33ae0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
33af0 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68  PB2) to track th
33b00 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e  e same 5 states.
33b10 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20  .** To simulate 
33b20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65  a F_RDLCK on the
33b30 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f   shared range, o
33b40 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79  n AFP a randomly
33b50 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64   selected.** add
33b60 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72  ress in the shar
33b70 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
33b80 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c  n for a SHARED l
33b90 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a  ock, the entire.
33ba0 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  ** shared range 
33bb0 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20  is taken for an 
33bc0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a  EXCLUSIVE lock):
33bd0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44  .**.**      PEND
33be0 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
33bf0 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20  0x40000000.**   
33c00 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
33c10 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
33c20 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
33c30 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
33c40 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
33c50 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
33c60 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
33c70 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
33c80 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
33c90 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
33ca0 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
33cb0 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
33cc0 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
33cd0 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
33ce0 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
33cf0 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
33d00 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
33d10 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
33d20 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
33d30 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
33d40 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
33d50 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
33d60 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
33d70 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
33d80 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
33d90 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
33da0 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
33db0 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
33dc0 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
33dd0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
33de0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
33df0 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
33e00 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
33e10 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
33e20 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
33e30 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
33e40 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
33e50 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
33e60 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
33e70 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
33e80 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
33e90 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
33ea0 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
33eb0 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
33ec0 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
33ed0 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
33ee0 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
33ef0 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
33f00 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
33f10 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
33f20 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
33f30 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
33f40 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
33f50 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
33f60 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
33f70 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
33f80 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
33f90 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
33fa0 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
33fb0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
33fc0 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
33fd0 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
33fe0 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
33ff0 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
34000 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
34010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
34020 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
34030 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
34040 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
34050 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ame, SQLITE_FCNT
34060 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
34070 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
34080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
34090 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
340a0 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
340b0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
340c0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
340d0 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f  ITE_FCNTL_GET_LO
340e0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
340f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34100 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61        &<proxy_pa
34110 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53  th>);.**.**.** S
34120 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a  QL pragmas.**.**
34130 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
34140 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
34150 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e  ile=<proxy_path>
34160 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52   | :auto:.**  PR
34170 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
34180 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a  lock_proxy_file.
34190 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67  **.** Specifying
341a0 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20   ":auto:" means 
341b0 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73  that if there is
341c0 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69   a conch file wi
341d0 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a  th a matching.**
341e0 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20   host ID in it, 
341f0 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69  the proxy path i
34200 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
34210 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f   will be used, o
34220 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72  therwise.** a pr
34230 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f  oxy path based o
34240 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d  n the user's tem
34250 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f  p dir.** (via co
34260 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
34270 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e  _USER_TEMP_DIR,.
34280 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65  ..)) will be use
34290 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74  d and the.** act
342a0 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e  ual proxy file n
342b0 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ame is generated
342c0 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61   from the name a
342d0 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a  nd path of the.*
342e0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
342f0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
34300 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64  *.**       For d
34310 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55  atabase path "/U
34320 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20  sers/me/foo.db" 
34330 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f  .**       The lo
34340 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
34350 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65  "<tmpdir>/sqlite
34360 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65  plocks/_Users_me
34370 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a  _foo.db:auto:").
34380 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63  **.** Once a loc
34390 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69  k proxy is confi
343a0 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61  gured for a data
343b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c  base connection,
343c0 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62   it can not.** b
343d0 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76  e removed, howev
343e0 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69  er it may be swi
343f0 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65  tched to a diffe
34400 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20  rent proxy path 
34410 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65  via.** the above
34420 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20   APIs (assuming 
34430 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  the conch file i
34440 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64  s not being held
34450 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63   by another.** c
34460 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f  onnection or pro
34470 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  cess). .**.**.**
34480 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69   How proxy locki
34490 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d  ng works.** ----
344a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
344b0 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ---.**.** Proxy 
344c0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c  file locking rel
344d0 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e  ies primarily on
344e0 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74   two new support
344f0 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a  ing files: .**.*
34500 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c  *   *  conch fil
34510 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73  e to limit acces
34520 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
34530 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67  e file to a sing
34540 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20  le host.**      
34550 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20  at a time.**.** 
34560 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20    *  proxy file 
34570 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78  to act as a prox
34580 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f  y for the adviso
34590 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c  ry locks normall
345a0 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20  y.**      taken 
345b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
345c0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20  **.** The conch 
345d0 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20  file - to use a 
345e0 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69  proxy file, sqli
345f0 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68  te must first "h
34600 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a  old the conch".*
34610 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73  * by taking an s
34620 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72  qlite-style shar
34630 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
34640 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69  onch file, readi
34650 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
34660 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67  ts and comparing
34670 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71   the host's uniq
34680 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20  ue host ID (see 
34690 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a  below) and lock.
346a0 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67  ** proxy path ag
346b0 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73  ainst the values
346c0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
346d0 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68  onch.  The conch
346e0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72   file is.** stor
346f0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
34700 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20  irectory as the 
34710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
34720 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a  d the file name.
34730 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20  ** is patterned 
34740 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61  after the databa
34750 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  se file name as 
34760 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e  ".<databasename>
34770 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74  -conch"..** If t
34780 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f  he conch file do
34790 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  es not exist, or
347a0 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f   its contents do
347b0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a   not match the.*
347c0 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72  * host ID and/or
347d0 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65   proxy path, the
347e0 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73  n the lock is es
347f0 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78  calated to an ex
34800 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20  clusive.** lock 
34810 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69  and the conch fi
34820 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75  le contents is u
34830 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
34840 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78  host ID and prox
34850 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68  y.** path and th
34860 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72  e lock is downgr
34870 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64  aded to a shared
34880 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66   lock again.  If
34890 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73   the conch.** is
348a0 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
348b0 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61   process (with a
348c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74   shared lock), t
348d0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
348e0 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61  k.** will fail a
348f0 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
34900 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
34910 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
34920 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65   - a single-byte
34930 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61   file used for a
34940 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65  ll advisory file
34950 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c   locks.** normal
34960 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20  ly taken on the 
34970 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
34980 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72   This allows for
34990 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a   safe sharing.**
349a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
349b0 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70   file for multip
349c0 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  le readers and w
349d0 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61  riters on the sa
349e0 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20  me.** host (the 
349f0 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68  conch ensures th
34a00 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20  at they all use 
34a10 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c  the same local l
34a20 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a  ock file)..**.**
34a30 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20   Requesting the 
34a40 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20  lock proxy does 
34a50 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  not immediately 
34a60 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20  take the conch, 
34a70 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61  it is.** only ta
34a80 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72  ken when the fir
34a90 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f  st request to lo
34aa0 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ck database file
34ab0 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54   is made.  .** T
34ac0 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
34ad0 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65  semantics of the
34ae0 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63   traditional loc
34af0 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77  king behavior, w
34b00 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  here.** opening 
34b10 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
34b20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
34b30 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20  does not take a 
34b40 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54  lock on it..** T
34b50 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61  he shared lock a
34b60 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  nd an open file 
34b70 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d  descriptor are m
34b80 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20  aintained until 
34b90 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
34ba0 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
34bb0 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a  se is closed. .*
34bc0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
34bd0 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ile and the lock
34be0 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20   file are never 
34bf0 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20  deleted so they 
34c00 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  only need.** to 
34c10 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66  be created the f
34c20 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61  irst time they a
34c30 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  re used..**.** C
34c40 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
34c50 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
34c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
34c70 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46  .**  SQLITE_PREF
34c80 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
34c90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74  .**.**       Dat
34ca0 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65  abase files acce
34cb0 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61  ssed on non-loca
34cc0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61  l file systems a
34cd0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f  re.**       auto
34ce0 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67  matically config
34cf0 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c  ured for proxy l
34d00 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c  ocking, lock fil
34d10 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
34d20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
34d30 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61  lly using the sa
34d40 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20  me logic as.**  
34d50 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
34d60 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75  _proxy_file=":au
34d70 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  to:".**    .**  
34d80 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
34d90 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45  UG.**.**       E
34da0 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69  nables the loggi
34db0 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73  ng of error mess
34dc0 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74  ages during host
34dd0 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20   id file.**     
34de0 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20    retrieval and 
34df0 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  creation.**.**  
34e00 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a  LOCKPROXYDIR.**.
34e10 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
34e20 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  es the default d
34e30 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f  irectory used fo
34e40 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  r lock proxy fil
34e50 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
34e60 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d   are named autom
34e70 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65  atically via the
34e80 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e   ":auto:" settin
34e90 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  g.**.**  SQLITE_
34ea0 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
34eb0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a  _PERMISSIONS.**.
34ec0 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73  **       Permiss
34ed0 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e  ions to use when
34ee0 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65   creating a dire
34ef0 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e  ctory for storin
34f00 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c  g the.**       l
34f10 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c  ock proxy files,
34f20 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
34f30 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20  LOCKPROXYDIR is 
34f40 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a  not set..**    .
34f50 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e  **    .** As men
34f60 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68  tioned above, wh
34f70 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  en compiled with
34f80 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
34f90 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a  ROXY_LOCKING,.**
34fa0 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76   setting the env
34fb0 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
34fc0 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  e SQLITE_FORCE_P
34fd0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20  ROXY_LOCKING to 
34fe0 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20  1 will.** force 
34ff0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
35000 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65   be used for eve
35010 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
35020 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a   opened, and 0.*
35030 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74  * will force aut
35040 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63  omatic proxy loc
35050 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62  king to be disab
35060 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  led for all data
35070 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65  base.** files (e
35080 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e  xplicitly callin
35090 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  g the SQLITE_FCN
350a0 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
350b0 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a  FILE pragma or.*
350c0 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f  * sqlite_file_co
350d0 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74  ntrol API is not
350e0 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c   affected by SQL
350f0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
35100 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a  LOCKING)..*/../*
35110 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
35120 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
35130 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a  ble on MacOSX .*
35140 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
35150 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
35160 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
35170 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54  G_STYLE../*.** T
35180 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  he proxyLockingC
35190 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70  ontext has the p
351a0 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72  ath and file str
351b0 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20  uctures for the 
351c0 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c  remote .** and l
351d0 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73  ocal proxy files
351e0 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65   in it.*/.typede
351f0 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  f struct proxyLo
35200 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f  ckingContext pro
35210 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
35220 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  ;.struct proxyLo
35230 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
35240 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
35250 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  File;         /*
35260 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   Open conch file
35270 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
35280 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20  hFilePath;      
35290 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
352a0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
352b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
352c0 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f  Proxy;         /
352d0 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63  * Open proxy loc
352e0 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
352f0 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b   *lockProxyPath;
35300 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
35310 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
35320 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
35330 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
35340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
35350 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
35360 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63  le */.  int conc
35370 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  hHeld;          
35380 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65       /* 1 if the
35390 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20   conch is held, 
353a0 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a  -1 if lockless *
353b0 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20  /.  int nFails; 
353c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
353e0 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75  nch taking failu
353f0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  res */.  void *o
35400 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
35410 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
35420 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
35430 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
35440 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
35450 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
35460 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
35470 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
35480 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
35490 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
354a0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
354b0 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
354c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
354d0 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
354e0 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
354f0 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
35500 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
35510 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
35520 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
35530 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
35540 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
35550 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35560 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
35570 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
35580 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
35590 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
355a0 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
355b0 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
355c0 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
355d0 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
355e0 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
355f0 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
35600 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
35610 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
35620 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
35630 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
35640 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
35650 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
35660 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
35670 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
35680 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
35690 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
356a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
356b0 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
356c0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
356d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
356e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
356f0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
35700 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
35710 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20  "sqliteplocks", 
35720 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d  maxLen);    .  }
35730 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20  .# else.  len = 
35740 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22  strlcpy(lPath, "
35750 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  /tmp/", maxLen);
35760 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
35770 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e  .  if( lPath[len
35780 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  -1]!='/' ){.    
35790 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
357a0 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e  ath, "/", maxLen
357b0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74  );.  }.  .  /* t
357c0 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20  ransform the db 
357d0 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65  path to a unique
357e0 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20   cache name */. 
357f0 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74   dbLen = (int)st
35800 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20  rlen(dbPath);.  
35810 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65  for( i=0; i<dbLe
35820 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28  n && (i+len+7)<(
35830 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29  int)maxLen; i++)
35840 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64  {.    char c = d
35850 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50  bPath[i];.    lP
35860 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d  ath[i+len] = (c=
35870 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d  ='/')?'_':c;.  }
35880 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d  .  lPath[i+len]=
35890 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28  '\0';.  strlcat(
358a0 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c  lPath, ":auto:",
358b0 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52   maxLen);.  OSTR
358c0 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
358d0 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
358e0 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
358f0 20 6c 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64   lPath, osGetpid
35900 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (0)));.  return 
35910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
35920 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
35930 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
35940 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
35950 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
35960 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
35970 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
35980 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
35990 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
359a0 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
359b0 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
359c0 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
359d0 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
359e0 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
359f0 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
35a00 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
35a10 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
35a20 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
35a30 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
35a40 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
35a50 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
35a60 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
35a70 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
35a80 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
35a90 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
35aa0 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
35ab0 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
35ac0 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
35ad0 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
35ae0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
35af0 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
35b00 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
35b10 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
35b20 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
35b30 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
35b40 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
35b50 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
35b60 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
35b70 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
35b80 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
35b90 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b          if( osMk
35ba0 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
35bb0 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
35bc0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
35bd0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
35be0 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
35bf0 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
35c00 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
35c10 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
35c20 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
35c30 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
35c40 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
35c50 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
35c60 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
35c70 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
35c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c90 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
35ca0 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
35cb0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
35cc0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
35cd0 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
35ce0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
35cf0 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
35d00 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
35d10 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
35d20 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
35d30 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
35d40 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
35d50 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
35d60 6e 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73 47 65  n",lockPath,osGe
35d70 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74  tpid(0)));.  ret
35d80 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
35d90 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
35da0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
35db0 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
35dc0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
35dd0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
35de0 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
35df0 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
35e00 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
35e10 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
35e20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
35e30 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
35e40 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
35e50 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
35e60 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
35e70 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
35e80 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
35e90 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
35ea0 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
35eb0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
35ec0 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
35ed0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
35ee0 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
35ef0 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
35f00 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
35f10 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
35f20 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
35f30 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
35f40 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
35f50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
35f60 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
35f70 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
35f80 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
35f90 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
35fa0 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
35fb0 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
35fc0 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
35fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
35fe0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
35ff0 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
36000 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
36010 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72  myVfs;.  int ter
36020 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  rno = 0;.  UnixU
36030 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
36040 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31   = NULL;..  /* 1
36050 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f  . first try to o
36060 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
36070 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74  ile.  ** 2. if t
36080 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74  hat fails, and t
36090 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69  his is a lock fi
360a0 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20  le (not-conch), 
360b0 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  try creating.  *
360c0 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  * the parent dir
360d0 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65  ectories and the
360e0 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a  n try again..  *
360f0 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 3. if that fai
36100 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ls, try to open 
36110 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e  the file read-on
36120 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  ly.  ** otherwis
36130 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69  e return BUSY (i
36140 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20  f lock file) or 
36150 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65  CANTOPEN for the
36160 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f   conch file.  */
36170 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e  .  pUnused = fin
36180 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68  dReusableFd(path
36190 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20  , openFlags);.  
361a0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
361b0 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
361c0 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >fd;.  }else{.  
361d0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
361e0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a  te3_malloc64(siz
361f0 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
36200 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
36210 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
36220 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
36230 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
36240 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20  d<0 ){.    fd = 
36250 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
36260 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  , openFlags, 0);
36270 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
36280 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  rno;.    if( fd<
36290 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45  0 && errno==ENOE
362a0 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65  NT && islockfile
362b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
362c0 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
362d0 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54  h(path) == SQLIT
362e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
362f0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
36300 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
36310 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
36320 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64    }.  }.  if( fd
36330 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c  <0 ){.    openFl
36340 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  ags = O_RDONLY;.
36350 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
36360 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
36370 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65  lags, 0);.    te
36380 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
36390 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
363a0 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69      if( islockfi
363b0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  le ){.      retu
363c0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
363d0 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
363e0 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20   (terrno) {.    
363f0 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20    case EACCES:. 
36400 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
36410 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
36420 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20   case EIO: .    
36430 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36440 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a  E_IOERR_LOCK; /*
36450 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
36460 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a  is the conch */.
36470 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
36480 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
36490 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
364a0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
364b0 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  .  pNew = (unixF
364c0 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ile *)sqlite3_ma
364d0 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70  lloc64(sizeof(*p
364e0 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  New));.  if( pNe
364f0 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72  w==NULL ){.    r
36500 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
36510 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63  ;.    goto end_c
36520 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d  reate_proxy;.  }
36530 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
36540 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
36550 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  le));.  pNew->op
36560 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
36570 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ags;.  memset(&d
36580 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65  ummyVfs, 0, size
36590 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20  of(dummyVfs));. 
365a0 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61   dummyVfs.pAppDa
365b0 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74  ta = (void*)&aut
365c0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20  olockIoFinder;. 
365d0 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20   dummyVfs.zName 
365e0 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e  = "dummy";.  pUn
365f0 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  used->fd = fd;. 
36600 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20   pUnused->flags 
36610 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70  = openFlags;.  p
36620 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  New->pUnused = p
36630 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20  Unused;.  .  rc 
36640 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
36650 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20  (&dummyVfs, fd, 
36660 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
36670 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20  New, path, 0);. 
36680 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36690 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c  OK ){.    *ppFil
366a0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65  e = pNew;.    re
366b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
366c0 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70    }.end_create_p
366d0 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75  roxy:    .  robu
366e0 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66  st_close(pNew, f
366f0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
36700 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
36710 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  w);.  sqlite3_fr
36720 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72  ee(pUnused);.  r
36730 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
36740 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
36750 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
36760 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
36770 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
36780 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
36790 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68  */.int sqlite3_h
367a0 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23  ostid_num = 0;.#
367b0 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50  endif..#define P
367c0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20  ROXY_HOSTIDLEN  
367d0 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66    16  /* conch f
367e0 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67  ile host id leng
367f0 74 68 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48 41  th */..#ifdef HA
36800 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 0a 2f  VE_GETHOSTUUID./
36810 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66  * Not always def
36820 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ined in the head
36830 65 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20  ers as it ought 
36840 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20  to be */.extern 
36850 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28  int gethostuuid(
36860 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74  uuid_t id, const
36870 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
36880 20 2a 77 61 69 74 29 3b 0a 23 65 6e 64 69 66 0a   *wait);.#endif.
36890 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
368a0 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75   ID via gethostu
368b0 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d  uid(), pHostID m
368c0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f  ust point to PRO
368d0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a  XY_HOSTIDLEN .**
368e0 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62   bytes of writab
368f0 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
36900 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
36910 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64  tHostID(unsigned
36920 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20   char *pHostID, 
36930 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  int *pError){.  
36940 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53  assert(PROXY_HOS
36950 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66  TIDLEN == sizeof
36960 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d  (uuid_t));.  mem
36970 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20  set(pHostID, 0, 
36980 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
36990 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 45  ;.#ifdef HAVE_GE
369a0 54 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20 20  THOSTUUID.  {.  
369b0 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
369c0 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20  c timeout = {1, 
369d0 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d  0}; /* 1 sec tim
369e0 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  eout */.    if( 
369f0 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73  gethostuuid(pHos
36a00 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29  tID, &timeout) )
36a10 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20  {.      int err 
36a20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
36a30 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
36a40 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65       *pError = e
36a50 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
36a60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36a70 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
36a80 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
36a90 50 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72  PARAMETER(pError
36aa0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
36ab0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
36ac0 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
36ad0 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
36ae0 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
36af0 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
36b00 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
36b10 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29  hostid_num != 0)
36b20 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d  {.    pHostID[0]
36b30 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49   = (char)(pHostI
36b40 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71  D[0] + (char)(sq
36b50 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
36b60 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23   & 0xFF));.  }.#
36b70 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
36b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
36b90 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  /* The conch fil
36ba0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68  e contains the h
36bb0 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61  eader, host id a
36bc0 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
36bd0 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  h. */.#define PR
36be0 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
36bf0 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68   2   /* 1-byte h
36c00 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68  eader, 16-byte h
36c10 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a  ost id, path */.
36c20 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45  #define PROXY_HE
36c30 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f  ADERLEN    1   /
36c40 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61  * conch file hea
36c50 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64  der length */.#d
36c60 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48  efine PROXY_PATH
36c70 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f  INDEX    (PROXY_
36c80 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
36c90 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69  HOSTIDLEN).#defi
36ca0 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  ne PROXY_MAXCONC
36cb0 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41  HLEN  (PROXY_HEA
36cc0 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
36cd0 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45  TIDLEN+MAXPATHLE
36ce0 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73  N)../* .** Takes
36cf0 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66   an open conch f
36d00 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20  ile, copies the 
36d10 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65  contents to a ne
36d20 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20  w path and then 
36d30 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63  moves .** it bac
36d40 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72  k.  The newly cr
36d50 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c  eated file's fil
36d60 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
36d70 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a  assigned to the.
36d80 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74  ** conch file st
36d90 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61  ructure and fina
36da0 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  lly the original
36db0 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63   conch file desc
36dc0 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c  riptor is .** cl
36dd0 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a  osed.  Returns z
36de0 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75  ero if successfu
36df0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
36e00 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68   proxyBreakConch
36e10 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
36e20 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
36e30 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c  ostID){.  proxyL
36e40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
36e50 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36e60 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36e70 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36e80 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
36e90 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
36ea0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
36eb0 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41  char tPath[MAXPA
36ec0 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62  THLEN];.  char b
36ed0 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
36ee0 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63  HLEN];.  char *c
36ef0 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  Path = pCtx->con
36f00 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69  chFilePath;.  si
36f10 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30  ze_t readLen = 0
36f20 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c  ;.  size_t pathL
36f30 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65  en = 0;.  char e
36f40 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a  rrmsg[64] = "";.
36f50 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
36f60 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20   int rc = -1;.  
36f70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
36f80 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f  (myHostID);..  /
36f90 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  * create a new p
36fa0 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74  ath by replace t
36fb0 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f  he trailing '-co
36fc0 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61  nch' with '-brea
36fd0 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20  k' */.  pathLen 
36fe0 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c  = strlcpy(tPath,
36ff0 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c   cPath, MAXPATHL
37000 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c  EN);.  if( pathL
37010 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c  en>MAXPATHLEN ||
37020 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20   pathLen<6 || . 
37030 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50      (strlcpy(&tP
37040 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20  ath[pathLen-5], 
37050 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35  "break", 6) != 5
37060 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
37070 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
37080 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
37090 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e  "path error (len
370a0 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c   %d)",(int)pathL
370b0 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
370c0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
370d0 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63  .  /* read the c
370e0 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  onch content */.
370f0 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72    readLen = osPr
37100 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
37110 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58  , buf, PROXY_MAX
37120 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
37130 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58  if( readLen<PROX
37140 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20  Y_PATHINDEX ){. 
37150 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37160 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
37170 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20  g),errmsg,"read 
37180 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
37190 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20  (int)readLen);. 
371a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
371b0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
371c0 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
371d0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72  the temporary br
371e0 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64  eak file */.  fd
371f0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74   = robust_open(t
37200 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f  Path, (O_RDWR|O_
37210 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30  CREAT|O_EXCL), 0
37220 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
37230 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
37240 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
37250 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63  msg), errmsg, "c
37260 72 65 61 74 65 20 66 61 69 6c 65 64 20 28 25 64  reate failed (%d
37270 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
37280 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
37290 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  ck;.  }.  if( os
372a0 50 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20  Pwrite(fd, buf, 
372b0 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28  readLen, 0) != (
372c0 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20  ssize_t)readLen 
372d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
372e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
372f0 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
37300 22 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25  "write failed (%
37310 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
37320 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
37330 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ock;.  }.  if( r
37340 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61  ename(tPath, cPa
37350 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  th) ){.    sqlit
37360 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
37370 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
37380 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c  sg, "rename fail
37390 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
373a0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
373b0 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
373c0 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74  rc = 0;.  fprint
373d0 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65  f(stderr, "broke
373e0 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25   stale lock on %
373f0 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20  s\n", cPath);.  
37400 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
37410 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  le, conchFile->h
37420 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63  , __LINE__);.  c
37430 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64  onchFile->h = fd
37440 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f  ;.  conchFile->o
37450 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
37460 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e  R | O_CREAT;..en
37470 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69  d_breaklock:.  i
37480 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
37490 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
374a0 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b  osUnlink(tPath);
374b0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
374c0 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f  ose(pFile, fd, _
374d0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
374e0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
374f0 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62  rr, "failed to b
37500 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20  reak stale lock 
37510 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50  on %s, %s\n", cP
37520 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20  ath, errmsg);.  
37530 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
37540 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65  ../* Take the re
37550 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20  quested lock on 
37560 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61  the conch file a
37570 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65  nd break a stale
37580 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a   lock if the .**
37590 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
375a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
375b0 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75  proxyConchLock(u
375c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
375d0 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c  uuid_t myHostID,
375e0 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a   int lockType){.
375f0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
37600 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
37610 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
37620 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
37630 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
37640 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
37650 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
37660 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
37670 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
37680 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20  t nTries = 0;.  
37690 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
376a0 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20  conchModTime;.  
376b0 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68  .  memset(&conch
376c0 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65  ModTime, 0, size
376d0 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29  of(conchModTime)
376e0 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  );.  do {.    rc
376f0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
37700 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
37710 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
37720 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
37730 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b  ;.    nTries ++;
37740 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
37750 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
37760 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b    /* If the lock
37770 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a   failed (busy):.
37780 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79         * 1st try
37790 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69  : get the mod ti
377a0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c  me of the conch,
377b0 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74   wait 0.5s and t
377c0 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20  ry again. .     
377d0 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69    * 2nd try: fai
377e0 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d  l if the mod tim
377f0 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73  e changed or hos
37800 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e  t id is differen
37810 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20  t, wait .       
37820 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73  *           10 s
37830 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ec and try again
37840 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72  .       * 3rd tr
37850 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  y: break the loc
37860 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64  k unless the mod
37870 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65   time has change
37880 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d..       */.   
37890 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
378a0 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73  uf;.      if( os
378b0 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d  Fstat(conchFile-
378c0 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
378d0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
378e0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
378f0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
37900 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
37910 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
37920 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
37930 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ries==1 ){.     
37940 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20     conchModTime 
37950 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
37960 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65  ec;.        usle
37970 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77  ep(500000); /* w
37980 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20  ait 0.5 sec and 
37990 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
379a0 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  in*/.        con
379b0 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d  tinue;  .      }
379c0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
379d0 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20  nTries>1 );.    
379e0 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69    if( conchModTi
379f0 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66  me.tv_sec != buf
37a00 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
37a10 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20  _sec || .       
37a20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74    conchModTime.t
37a30 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74  v_nsec != buf.st
37a40 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73  _mtimespec.tv_ns
37a50 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ec ){.        re
37a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
37a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37a80 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65  .      if( nTrie
37a90 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20  s==2 ){  .      
37aa0 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58    char tBuf[PROX
37ab0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
37ac0 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
37ad0 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
37ae0 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52  ile->h, tBuf, PR
37af0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c  OXY_MAXCONCHLEN,
37b00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
37b10 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20   len<0 ){.      
37b20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
37b30 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
37b40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
37b50 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
37b60 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LOCK;.        }.
37b70 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
37b80 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
37b90 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61  && tBuf[0]==(cha
37ba0 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
37bb0 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20  SION){.         
37bc0 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
37bd0 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  the lock if the 
37be0 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20  host id doesn't 
37bf0 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
37c00 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70     if( 0!=memcmp
37c10 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41  (&tBuf[PROXY_HEA
37c20 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49  DERLEN], myHostI
37c30 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  D, PROXY_HOSTIDL
37c40 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EN) ){.         
37c50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37c60 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
37c70 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
37c80 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64  {.          /* d
37c90 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c  on't break the l
37ca0 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61  ock on short rea
37cb0 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d  d or a version m
37cc0 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  ismatch */.     
37cd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
37ce0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
37cf0 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65   }.        uslee
37d00 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20  p(10000000); /* 
37d10 77 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20  wait 10 sec and 
37d20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
37d30 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  in */.        co
37d40 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d  ntinue; .      }
37d50 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73  .      .      as
37d60 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20  sert( nTries==3 
37d70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
37d80 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
37d90 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
37da0 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tID) ){.        
37db0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37dc0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b          if( lock
37dd0 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Type==EXCLUSIVE_
37de0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
37df0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
37e00 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
37e10 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
37e20 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45  conchFile, SHARE
37e30 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
37e40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
37e50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
37e60 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
37e70 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
37e80 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
37e90 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
37ea0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
37eb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
37ec0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
37ed0 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73  E_BUSY && nTries
37ee0 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  <3 );.  .  retur
37ef0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
37f00 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
37f10 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
37f20 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
37f30 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
37f40 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
37f50 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
37f60 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
37f70 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
37f80 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
37f90 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
37fa0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
37fb0 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
37fc0 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
37fd0 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
37fe0 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
37ff0 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
38000 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
38010 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
38020 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
38030 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
38040 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
38050 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
38060 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
38070 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
38080 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
38090 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
380a0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
380b0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
380c0 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
380d0 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b  >conchHeld!=0 ){
380e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
380f0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
38100 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
38110 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
38120 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75  conchFile;.    u
38130 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a  uid_t myHostID;.
38140 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d      int pError =
38150 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61   0;.    char rea
38160 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  dBuf[PROXY_MAXCO
38170 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
38180 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41  r lockPath[MAXPA
38190 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  THLEN];.    char
381a0 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d   *tempLockPath =
381b0 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
381c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
381d0 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e     int createCon
381e0 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
381f0 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b  hostIdMatch = 0;
38200 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e  .    int readLen
38210 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72   = 0;.    int tr
38220 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
38230 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e  ;.    int forceN
38240 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ewLockPath = 0;.
38250 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45      .    OSTRACE
38260 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
38270 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
38280 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
38290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
382a0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
382b0 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
382c0 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
382d0 6f 3a 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  o:"),.          
382e0 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29     osGetpid(0)))
382f0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ;..    rc = prox
38300 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73  yGetHostID(myHos
38310 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20  tID, &pError);. 
38320 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
38330 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
38340 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
38350 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 70 45  tErrno(pFile, pE
38360 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 67 6f 74  rror);.      got
38370 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
38380 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
38390 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
383a0 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
383b0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
383c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
383d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
383e0 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
383f0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65  .    }.    /* re
38400 61 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ad the existing 
38410 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
38420 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b    readLen = seek
38430 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c  AndRead((unixFil
38440 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c  e*)conchFile, 0,
38450 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f   readBuf, PROXY_
38460 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20  MAXCONCHLEN);.  
38470 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20    if( readLen<0 
38480 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20  ){.      /* I/O 
38490 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f  error: lastErrno
384a0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
384b0 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 73 74 6f  ead */.      sto
384c0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
384d0 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61  e, conchFile->la
384e0 73 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  stErrno);.      
384f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
38500 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f  R_READ;.      go
38510 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
38520 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
38530 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f  readLen<=(PROXY_
38540 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
38550 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20  HOSTIDLEN) || . 
38560 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
38570 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52  Buf[0]!=(char)PR
38580 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
38590 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73   ){.      /* a s
385a0 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72  hort read or ver
385b0 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d  sion format mism
385c0 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65  atch means we ne
385d