/ Hex Artifact Content
Login

Artifact 3a441671f35569df4b72641e928fdb1ab5cd8576:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  .h>.#endif.#ifnd
1170: 65 66 20 4d 49 53 53 49 4e 47 5f 53 54 41 54 56  ef MISSING_STATV
1180: 46 53 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  FS.#include <sys
1190: 2f 73 74 61 74 76 66 73 2e 68 3e 0a 23 65 6e 64  /statvfs.h>.#end
11a0: 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  if...#if SQLITE_
11b0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
11c0: 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  TYLE.# include <
11d0: 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69  sys/ioctl.h>.# i
11e0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20  f OS_VXWORKS.#  
11f0: 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f  include <semapho
1200: 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  re.h>.#  include
1210: 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20 65 6c   <limits.h>.# el
1220: 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  se.#  include <s
1230: 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20 69 6e  ys/file.h>.#  in
1240: 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72 61 6d  clude <sys/param
1250: 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  .h>.# endif.#end
1260: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1270: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1280: 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  E */..#if define
1290: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
12a0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
12b0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
12c0: 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23 20 69  !OS_VXWORKS).# i
12d0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e  nclude <sys/moun
12e0: 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66  t.h>.#endif..#if
12f0: 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 23  def HAVE_UTIME.#
1300: 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d 65 2e   include <utime.
1310: 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  h>.#endif../*.**
1320: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
1330: 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73 46 6c  of unixFile.fsFl
1340: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ags.*/.#define S
1350: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
1360: 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31 0a 0a  _MSDOS     0x1..
1370: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
1380: 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61 66  to be thread-saf
1390: 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70  e, include the p
13a0: 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20 61  threads header a
13b0: 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65  nd define.** the
13c0: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
13d0: 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  EADS macro..*/.#
13e0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
13f0: 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  SAFE.# include <
1400: 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66  pthread.h>.# def
1410: 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  ine SQLITE_UNIX_
1420: 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66  THREADS 1.#endif
1430: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ../*.** Default 
1440: 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e  permissions when
1450: 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
1460: 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  file.*/.#ifndef 
1470: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1480: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  ILE_PERMISSIONS.
1490: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
14a0: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
14b0: 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65  MISSIONS 0644.#e
14c0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 44 65 66  ndif../*. ** Def
14d0: 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
14e0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
14f0: 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 20 2a  uto proxy dir. *
1500: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1510: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
1520: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
1530: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
1540: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
1550: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
1560: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1570: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1580: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1590: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
15a0: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
15b0: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
15c0: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
15d0: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
15e0: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
15f0: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1600: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1610: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
1620: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
1630: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
1640: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
1650: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
1660: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
1670: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
1680: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
1690: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
16a0: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
16d0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
16e0: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
16f0: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1700: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1710: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
1720: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
1730: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
1740: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
1750: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
1760: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
1770: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1780: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
1790: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
17a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17b0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
17c0: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
17d0: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
17e0: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
17f0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1800: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1810: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
1820: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
1830: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
1840: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1850: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
1860: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1870: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1880: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
1890: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
18a0: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
18b0: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
18c0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
18d0: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
18e0: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
18f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1900: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1910: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
1920: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1930: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
1940: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1950: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
1960: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
1970: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
1980: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
1990: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
19a0: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
19b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
19c0: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
19d0: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
19e0: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
19f0: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1a00: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1a10: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1a20: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1a30: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
1a40: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
1a50: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1a60: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
1a70: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
1a80: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
1a90: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1aa0: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1ab0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1ac0: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1ad0: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1ae0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1af0: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1b00: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1b10: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1b20: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1b30: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1b60: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
1b70: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
1b80: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
1b90: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1ba0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1bb0: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1bc0: 6e 65 64 20 63 68 61 72 20 63 74 72 6c 46 6c 61  ned char ctrlFla
1bd0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
1be0: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1bf0: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1c00: 6c 61 67 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lags */.  unsign
1c10: 65 64 20 63 68 61 72 20 73 7a 53 65 63 74 6f 72  ed char szSector
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c30: 20 53 65 63 74 6f 72 73 69 7a 65 2f 35 31 32 20   Sectorsize/512 
1c40: 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72  */.  int lastErr
1c50: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c70: 75 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20  unix errno from 
1c80: 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
1c90: 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e  /.  void *lockin
1ca0: 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20  gContext;       
1cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69          /* Locki
1cc0: 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69  ng style specifi
1cd0: 63 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69  c state */.  Uni
1ce0: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
1cf0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1d00: 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65   /* Pre-allocate
1d10: 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a  d UnixUnusedFd *
1d20: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1d30: 7a 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  zPath;          
1d40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1d50: 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1d60: 20 75 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20   unixShm *pShm; 
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
1d90: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e  emory segment in
1da0: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  formation */.  i
1db0: 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20  nt szChunk;     
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1de0: 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f   by FCNTL_CHUNK_
1df0: 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49  SIZE */.#if SQLI
1e00: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1e10: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
1e20: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e40: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1e50: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1e60: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1e70: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1e80: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
1e90: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1ea0: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
1eb0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1ec0: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
1ed0: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
1ee0: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
1ef0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1f00: 69 6e 74 20 69 73 44 65 6c 65 74 65 3b 20 20 20  int isDelete;   
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
1f30: 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
1f40: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
1f50: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
1f60: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75          /* Uniqu
1f70: 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e  e file ID */.#en
1f80: 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  dif.#ifndef NDEB
1f90: 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  UG.  /* The next
1fa0: 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62   group of variab
1fb0: 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  les are used to 
1fc0: 74 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72  track whether or
1fd0: 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72   not the.  ** tr
1fe0: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1ff0: 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37  r in bytes 24-27
2000: 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
2010: 65 73 20 61 72 65 20 75 70 64 61 74 65 64 0a 20  es are updated. 
2020: 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79   ** whenever any
2030: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2040: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
2050: 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75  An assertion fau
2060: 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63  lt will.  ** occ
2070: 75 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20  ur if a file is 
2080: 75 70 64 61 74 65 64 20 77 69 74 68 6f 75 74 20  updated without 
2090: 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68  also updating th
20a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
20b0: 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ** counter.  Thi
20c0: 73 20 74 65 73 74 20 69 73 20 6d 61 64 65 20 74  s test is made t
20d0: 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62  o avoid new prob
20e0: 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  lems similar to 
20f0: 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73  the.  ** one des
2100: 63 72 69 62 65 64 20 62 79 20 74 69 63 6b 65 74  cribed by ticket
2110: 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20   #3584. .  */.  
2120: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 72  unsigned char tr
2130: 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f  ansCntrChng;   /
2140: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74 72  * True if the tr
2150: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
2160: 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  r changed */.  u
2170: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 62 55  nsigned char dbU
2180: 70 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  pdate;        /*
2190: 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 72   True if any par
21a0: 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  t of database fi
21b0: 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  le changed */.  
21c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
21d0: 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f  NormalWrite;   /
21e0: 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e  * True if in a n
21f0: 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72  ormal write oper
2200: 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  ation */.#endif.
2210: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2220: 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20  ST.  /* In test 
2230: 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74  mode, increase t
2240: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20  he size of this 
2250: 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20  structure a bit 
2260: 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74  so that .  ** it
2270: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2280: 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68  the struct Crash
2290: 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20  File defined in 
22a0: 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20  test6.c..  */.  
22b0: 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32  char aPadding[32
22c0: 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  ];.#endif.};../*
22d0: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
22e0: 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69 78 46  es for the unixF
22f0: 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20 62 69  ile.ctrlFlags bi
2300: 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e  tmask:.*/.#defin
2310: 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20  e UNIXFILE_EXCL 
2320: 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20 20         0x01     
2330: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66  /* Connections f
2340: 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73 20  rom one process 
2350: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2360: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20  UNIXFILE_RDONLY 
2370: 20 20 20 20 20 30 78 30 32 20 20 20 20 20 2f 2a       0x02     /*
2380: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   Connection is r
2390: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ead only */.#def
23a0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  ine UNIXFILE_PER
23b0: 53 49 53 54 5f 57 41 4c 20 30 78 30 34 20 20 20  SIST_WAL 0x04   
23c0: 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20    /* Persistent 
23d0: 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e  WAL mode */.#ifn
23e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
23f0: 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20 64 65 66  LE_DIRSYNC.# def
2400: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  ine UNIXFILE_DIR
2410: 53 59 4e 43 20 20 20 20 30 78 30 38 20 20 20 20  SYNC    0x08    
2420: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79   /* Directory sy
2430: 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c  nc needed */.#el
2440: 73 65 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58  se.# define UNIX
2450: 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20  FILE_DIRSYNC    
2460: 30 78 30 30 0a 23 65 6e 64 69 66 0a 23 64 65 66  0x00.#endif.#def
2470: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  ine UNIXFILE_PSO
2480: 57 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20  W        0x10   
2490: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41    /* SQLITE_IOCA
24a0: 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
24b0: 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WRITE */../*.** 
24c0: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
24d0: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
24e0: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
24f0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
2500: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
2510: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
2520: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
2530: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
2540: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
2550: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
2560: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2570: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2580: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
2590: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
25a0: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
25b0: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
25c0: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
25d0: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
25e0: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
25f0: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
2600: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
2610: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
2620: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2630: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
2640: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
2650: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
2660: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
2670: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2680: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2690: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
26a0: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
26b0: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
26c0: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
26d0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
26e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
26f0: 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73  fferent Unix sys
2700: 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65  tems declare ope
2710: 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74  n() in different
2720: 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65   ways.  Same use
2730: 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  .** open(const c
2740: 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29  har*,int,mode_t)
2750: 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70  .  Others use op
2760: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
2770: 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20  nt,...)..** The 
2780: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d  difference is im
2790: 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69  portant when usi
27a0: 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
27b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
27c0: 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77  .** The safest w
27d0: 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ay to deal with 
27e0: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
27f0: 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69  o always use thi
2800: 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69  s wrapper.** whi
2810: 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  ch always has th
2820: 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69  e same well-defi
2830: 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ned interface..*
2840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
2850: 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  ixOpen(const cha
2860: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c  r *zFile, int fl
2870: 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a  ags, int mode){.
2880: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46    return open(zF
2890: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65  ile, flags, mode
28a0: 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  );.}../* Forward
28b0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
28c0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
28d0: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
28e0: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a  r*, int*);../*.*
28f0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
2900: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2910: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2920: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2930: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2940: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2950: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2960: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2970: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2980: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2990: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
29a0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
29b0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
29c0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
29d0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
29e0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
29f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
2a00: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2a10: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2a20: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2a30: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2a40: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2a50: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2a60: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2a70: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2a80: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2a90: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2aa0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
2ab0: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
2ac0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
2ad0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
2ae0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
2af0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2b00: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2b10: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2b20: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2b30: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2b40: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2b50: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2b60: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2b70: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2b80: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2b90: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2ba0: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
2bb0: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
2bc0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2bd0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
2be0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2bf0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
2c00: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2c10: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2c20: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2c30: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2c40: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2c50: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2c60: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2c70: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2c80: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2c90: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2ca0: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2cb0: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2cc0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2cd0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2ce0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2cf0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2d00: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2d10: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2d20: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2d30: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2d40: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2d50: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2d60: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2d70: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2d80: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2d90: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2da0: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2db0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2dc0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2dd0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2de0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2df0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2e00: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2e10: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
2e20: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
2e30: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
2e40: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
2e50: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
2e60: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
2e70: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2e80: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2e90: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
2ea0: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
2eb0: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
2ec0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
2ed0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2ee0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
2ef0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
2f00: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
2f10: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2f20: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
2f30: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
2f40: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
2f50: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
2f60: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2f70: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
2f80: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2f90: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
2fa0: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
2fb0: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
2fc0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
2fd0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
2fe0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2ff0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
3000: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
3010: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
3020: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
3030: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
3040: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
3050: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3060: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
3070: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
3080: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
3090: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
30a0: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
30b0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
30c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
30d0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
30e0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
30f0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
3100: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
3110: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3120: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
3130: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3140: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3150: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3160: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3170: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3180: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3190: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
31a0: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
31b0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
31c0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
31d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
31e0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
31f0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
3200: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3210: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3220: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3230: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3240: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3250: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3260: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3270: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3280: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3290: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
32a0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
32b0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
32c0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
32d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
32e0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
32f0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3300: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
3310: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3320: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3330: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3340: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3350: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3360: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3370: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3380: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3390: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
33a0: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
33b0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
33c0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
33d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
33e0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
33f0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3400: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3410: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3420: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3430: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3440: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3450: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3460: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3470: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3480: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3490: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
34a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
34b0: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
34c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
34d0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
34e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34f0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3500: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3510: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3520: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3530: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3540: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3570: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3580: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3590: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
35a0: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
35b0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
35c0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
35d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
35e0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
35f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3600: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3610: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3620: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3630: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3640: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3650: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3660: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3670: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3680: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3690: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
36a0: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
36b0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
36c0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
36d0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
36e0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
36f0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3700: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3710: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3720: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3730: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3740: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3750: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3760: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
3770: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
3780: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3790: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
37a0: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
37b0: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
37c0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
37d0: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
37e0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
37f0: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
3800: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3810: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
3820: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
3830: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
3840: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
3850: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3860: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
3870: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3880: 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20   "mkdir",       
3890: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
38a0: 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20  l_ptr)mkdir,    
38b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
38c0: 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20  ine osMkdir     
38d0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
38e0: 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79  har*,mode_t))aSy
38f0: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
3900: 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22  nt)..  { "rmdir"
3910: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3920: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d  3_syscall_ptr)rm
3930: 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30  dir,           0
3940: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d   },.#define osRm
3950: 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29  dir     ((int(*)
3960: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3970: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
3980: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3990: 64 28 4d 49 53 53 49 4e 47 5f 53 54 41 54 56 46  d(MISSING_STATVF
39a0: 53 29 0a 20 20 7b 20 22 73 74 61 74 76 66 73 22  S).  { "statvfs"
39b0: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
39c0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
39e0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74  ,.#define osStat
39f0: 76 66 73 20 20 20 28 28 69 6e 74 28 2a 29 28 63  vfs   ((int(*)(c
3a00: 6f 6e 73 74 20 63 68 61 72 2a 2c 76 6f 69 64 2a  onst char*,void*
3a10: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70  ))aSyscall[20].p
3a20: 43 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20  Current).#else. 
3a30: 20 7b 20 22 73 74 61 74 76 66 73 22 2c 20 20 20   { "statvfs",   
3a40: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3a50: 61 6c 6c 5f 70 74 72 29 73 74 61 74 76 66 73 2c  all_ptr)statvfs,
3a60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3a70: 65 66 69 6e 65 20 6f 73 53 74 61 74 76 66 73 20  efine osStatvfs 
3a80: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3a90: 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74   char*,struct st
3aa0: 61 74 76 66 73 2a 29 29 61 53 79 73 63 61 6c 6c  atvfs*))aSyscall
3ab0: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [20].pCurrent).#
3ac0: 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  endif..}; /* End
3ad0: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
3ae0: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
3af0: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
3b00: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
3b10: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
3b20: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
3b30: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
3b40: 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20   "unix" VFSes.  
3b50: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
3b60: 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c   opon successful
3b70: 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a  ly updating the.
3b80: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70  ** system call p
3b90: 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54  ointer, or SQLIT
3ba0: 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68  E_NOTFOUND if th
3bb0: 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67  ere is no config
3bc0: 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d  urable.** system
3bd0: 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d   call named zNam
3be0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3bf0: 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61   unixSetSystemCa
3c00: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
3c10: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
3c20: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
3c30: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
3c40: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
3c50: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
3c60: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3c70: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
3c80: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
3c90: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ca0: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
3cb0: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
3cc0: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
3cd0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
3ce0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
3cf0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
3d00: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
3d10: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
3d20: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
3d30: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
3d40: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
3d50: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
3d60: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
3d70: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
3d80: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
3d90: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
3da0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
3db0: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
3dc0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
3dd0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
3de0: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
3df0: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
3e00: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
3e10: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
3e20: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
3e30: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
3e40: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
3e50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
3e60: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
3e70: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
3e80: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
3e90: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
3ea0: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
3eb0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
3ec0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
3ed0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
3ee0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
3ef0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
3f00: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
3f10: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
3f20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
3f30: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
3f40: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
3f50: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3f60: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
3f70: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
3f80: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
3f90: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3fa0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
3fb0: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
3fc0: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
3fd0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
3fe0: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
3ff0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
4000: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
4010: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4020: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4030: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4040: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
4050: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
4060: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
4070: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
4080: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
4090: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
40a0: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
40b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
40c0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
40d0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
40e0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
40f0: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
4100: 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73  l_ptr unixGetSys
4110: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
4120: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
4130: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4140: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67  zName.){.  unsig
4150: 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e  ned int i;..  UN
4160: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
4170: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28  NotUsed);.  for(
4180: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
4190: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
41a0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
41b0: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
41c0: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
41d0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
41e0: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
41f0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
4200: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4210: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
4220: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
4230: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rst system call 
4240: 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66  after zName.  If
4250: 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20   zName==NULL.** 
4260: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
4270: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
4280: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  t system call.  
4290: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
42a0: 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c  Name.** is the l
42b0: 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  ast system call 
42c0: 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  or if zName is n
42d0: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
42e0: 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d   valid.** system
42f0: 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
4300: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69   const char *uni
4310: 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28  xNextSystemCall(
4320: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20  sqlite3_vfs *p, 
4330: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4340: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
4350: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
4360: 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20  METER(p);.  if( 
4370: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72  zName ){.    for
4380: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
4390: 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69  e(aSyscall)-1; i
43a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
43b0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
43c0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
43d0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
43e0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b  }.  }.  for(i++;
43f0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
4400: 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20  scall); i++){.  
4410: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
4420: 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20  ].pCurrent!=0 ) 
4430: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
4440: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  i].zName;.  }.  
4450: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4460: 2a 2a 20 52 65 74 72 79 20 6f 70 65 6e 28 29 20  ** Retry open() 
4470: 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
4480: 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a  due to EINTR.*/.
4490: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
44a0: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
44b0: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e 74  r *z, int f, int
44c0: 20 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   m){.  int rc;. 
44d0: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 4f 70 65 6e   do{ rc = osOpen
44e0: 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c 65 28  (z,f,m); }while(
44f0: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
4500: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
4510: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  n rc;.}../*.** H
4520: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
4530: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
4540: 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
4550: 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
4560: 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
4570: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
4580: 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  t the unixInodeI
4590: 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72  nfo and.** vxwor
45a0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73  ksFileId objects
45b0: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66 69   used by this fi
45c0: 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68  le, all of which
45d0: 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72   may be .** shar
45e0: 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74  ed by multiple t
45f0: 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75  hreads..**.** Fu
4600: 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78  nction unixMutex
4610: 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
4620: 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
4630: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
4640: 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65   .** is held whe
4650: 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
4660: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
4670: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
4680: 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  f assert() .** s
4690: 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
46a0: 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  **.**   unixEnte
46b0: 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20  rMutex().**     
46c0: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
46d0: 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
46e0: 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29  unixEnterLeave()
46f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4700: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76  unixEnterMutex(v
4710: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
4720: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
4730: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
4740: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
4750: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
4760: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65  atic void unixLe
4770: 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
4780: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4790: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
47a0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
47b0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
47c0: 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  ER));.}.#ifdef S
47d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
47e0: 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78  ic int unixMutex
47f0: 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72  Held(void) {.  r
4800: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
4810: 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
4820: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
4830: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
4840: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69  ASTER));.}.#endi
4850: 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  f...#if defined(
4860: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
4870: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
4880: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  EBUG)./*.** Help
4890: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
48a0: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
48b0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
48c0: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
48d0: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
48e0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
48f0: 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e  ng represetation
4900: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
4910: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
4920: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
4930: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46   const char *azF
4940: 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c  ileLock(int eFil
4950: 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68  eLock){.  switch
4960: 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ( eFileLock ){. 
4970: 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a     case NO_LOCK:
4980: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
4990: 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f      case SHARED_
49a0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
49b0: 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  ARED";.    case 
49c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
49d0: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
49e0: 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49  ;.    case PENDI
49f0: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
4a00: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63  "PENDING";.    c
4a10: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
4a20: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
4a30: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
4a40: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
4a50: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
4a60: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
4a70: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
4a80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
4a90: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
4aa0: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
4ab0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4ac0: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
4ad0: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
4ae0: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
4af0: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
4b00: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
4b10: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
4b20: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
4b30: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
4b40: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
4b50: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
4b60: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
4b70: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
4b80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
4b90: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
4ba0: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
4bb0: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
4bc0: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
4bd0: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
4be0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
4bf0: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
4c00: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
4c10: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
4c20: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
4c30: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
4c40: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
4c50: 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63  se{.    s = osFc
4c60: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
4c70: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4c80: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e  Printf("fcntl un
4c90: 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e  known %d %d %d\n
4ca0: 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20  ", fd, op, s);. 
4cb0: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d     return s;.  }
4cc0: 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  .  if( p->l_type
4cd0: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
4ce0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
4cf0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
4d00: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
4d10: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
4d20: 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "WRLCK";.  }else
4d30: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
4d40: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_UNLCK ){.    z
4d50: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
4d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
4d70: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
4d80: 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65  assert( p->l_whe
4d90: 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b  nce==SEEK_SET );
4da0: 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66  .  s = osFcntl(f
4db0: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
4dc0: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
4dd0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4de0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
4df0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
4e00: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
4e10: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
4e20: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
4e30: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
4e40: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
4e50: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
4e60: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
4e70: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
4e80: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
4e90: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
4ea0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
4eb0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
4ec0: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
4ed0: 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  *p;.    osFcntl(
4ee0: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
4ef0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
4f00: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
4f10: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
4f20: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
4f30: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
4f40: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
4f50: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
4f60: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
4f70: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
4f80: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
4f90: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
4fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
4fb0: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
4fc0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
4fd0: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
4fe0: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
4ff0: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
5000: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
5010: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
5020: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
5030: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
5040: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
5050: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
5060: 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46   s;.}.#undef osF
5070: 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46  cntl.#define osF
5080: 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23  cntl lockTrace.#
5090: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
50a0: 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LOCK_TRACE */../
50b0: 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e  *.** Retry ftrun
50c0: 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61  cate() calls tha
50d0: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
50e0: 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NTR.*/.static in
50f0: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
5100: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
5110: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
5120: 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
5130: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
5140: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
5150: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
5160: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
5170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5180: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
5190: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
51a0: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
51b0: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
51c0: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
51d0: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
51e0: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
51f0: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
5200: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
5210: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
5220: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
5230: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
5240: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
5250: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
5260: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
5270: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
5280: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
5290: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
52a0: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
52b0: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
52c0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
52d0: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
52e0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
52f0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
5300: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
5310: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
5320: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
5330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5340: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
5350: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
5360: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
5370: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77  iteIOErr) {.  sw
5380: 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72  itch (posixError
5390: 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41  ) {.#if 0.  /* A
53a0: 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
53b0: 20 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f   code was not co
53c0: 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20  mmented out. In 
53d0: 74 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61  theory, this bra
53e0: 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  nch.  ** should 
53f0: 6e 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73  never be hit, as
5400: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
5410: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
5420: 6c 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20  lled after.  ** 
5430: 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65  a locking-relate
5440: 64 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  d function (i.e.
5450: 20 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65   fcntl()) has re
5460: 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20  turned non-zero 
5470: 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61  with.  ** the va
5480: 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20  lue of errno as 
5490: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
54a0: 6e 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74  nt. Since a syst
54b0: 65 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c  em call has fail
54c0: 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73  ed,.  ** errno s
54d0: 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72  hould be non-zer
54e0: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73  o..  **.  ** Des
54f0: 70 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72  pite this, if er
5500: 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65  rno really is ze
5510: 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e  ro, we still don
5520: 27 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72  't want to retur
5530: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  n.  ** SQLITE_OK
5540: 2e 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c  . The system cal
5550: 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73  l failed, and *s
5560: 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  ome* SQLite erro
5570: 72 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a  r should be.  **
5580: 20 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b   propagated back
5590: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
55a0: 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  Commenting this 
55b0: 62 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73  branch out means
55c0: 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77   errno==0.  ** w
55d0: 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
55e0: 79 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22  y the "default:"
55f0: 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a   case below..  *
5600: 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  /.  case 0: .   
5610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5620: 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  K;.#endif..  cas
5630: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
5640: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
5650: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
5660: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
5670: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
5680: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
5690: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
56a0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
56b0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
56c0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
56d0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
56e0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
56f0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
5700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5710: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
5720: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
5730: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
5740: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
5750: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
5760: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
5770: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
5780: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
5790: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
57a0: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
57b0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
57c0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
57d0: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
57e0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
57f0: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71  _RDLOCK) ||..(sq
5800: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
5810: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
5820: 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a  ESERVEDLOCK) ){.
5830: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5840: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
5850: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
5860: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61   through */.  ca
5870: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
5880: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
5890: 4d 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45  M;.    .  /* EDE
58a0: 41 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73  ADLK is only pos
58b0: 73 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20  sible if a call 
58c0: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
58d0: 57 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a  W) is made. And.
58e0: 20 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65    ** this module
58f0: 20 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63   never makes suc
5900: 68 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68  h a call. And th
5910: 65 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65  e code in SQLite
5920: 20 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73   itself .  ** as
5930: 73 65 72 74 73 20 74 68 61 74 20 53 51 4c 49 54  serts that SQLIT
5940: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
5950: 69 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65  is never returne
5960: 64 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65 61  d. For these rea
5970: 73 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63  sons.  ** this c
5980: 61 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d  ase is also comm
5990: 65 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68  ented out. If th
59a0: 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65  e system does se
59b0: 74 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44  t errno to EDEAD
59c0: 4c 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66  LK,.  ** the def
59d0: 61 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52  ault SQLITE_IOER
59e0: 52 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20  R_XXX code will 
59f0: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a  be returned. */.
5a00: 23 69 66 20 30 0a 20 20 63 61 73 65 20 45 44 45  #if 0.  case EDE
5a10: 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e  ADLK:.    return
5a20: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
5a30: 4f 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20  OCKED;.#endif.  
5a40: 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50    .#if EOPNOTSUP
5a50: 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  P!=ENOTSUP.  cas
5a60: 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20  e EOPNOTSUPP: . 
5a70: 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20     /* something 
5a80: 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77  went terribly aw
5a90: 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  ry, unless durin
5aa0: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
5ab0: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
5ac0: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
5ad0: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
5ae0: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
5af0: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  says */.#endif.#
5b00: 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20  ifdef ENOTSUP.  
5b10: 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20  case ENOTSUP: . 
5b20: 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64     /* invalid fd
5b30: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
5b40: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
5b50: 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f  ort introspectio
5b60: 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20  n, in which .   
5b70: 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20    * it actually 
5b80: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
5b90: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ys */.#endif.  c
5ba0: 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20  ase EIO:.  case 
5bb0: 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49  EBADF:.  case EI
5bc0: 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NVAL:.  case ENO
5bd0: 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e  TCONN:.  case EN
5be0: 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58  ODEV:.  case ENX
5bf0: 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e  IO:.  case ENOEN
5c00: 54 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45  T:.#ifdef ESTALE
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69       /* ESTALE i
5c30: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e  s not defined on
5c40: 20 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73   Interix systems
5c50: 20 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c   */.  case ESTAL
5c60: 45 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  E:.#endif.  case
5c70: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
5c80: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
5c90: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
5ca0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
5cb0: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
5cc0: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
5cd0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
5ce0: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
5cf0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
5d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d40: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
5d50: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
5d60: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
5d70: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
5d80: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
5d90: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
5da0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
5db0: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
5dc0: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
5dd0: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
5de0: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
5df0: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
5e00: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
5e10: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
5e20: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
5e30: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
5e40: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
5e50: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
5e60: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
5e70: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
5e80: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
5e90: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
5ea0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
5eb0: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
5ec0: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
5ed0: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
5ee0: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
5ef0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
5f00: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
5f10: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
5f20: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
5f30: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
5f40: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
5f50: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
5f60: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
5f70: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
5f80: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
5f90: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
5fa0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
5fb0: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
5fc0: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
5fd0: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
5fe0: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
5ff0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
6000: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
6010: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
6020: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
6030: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
6040: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
6050: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
6060: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6070: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
6080: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
6090: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
60a0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
60b0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
60e0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
60f0: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
6100: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
6110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
6120: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
6130: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
6140: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
6150: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
6160: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
6170: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
6180: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
6190: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
61a0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
61b0: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
61c0: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
61d0: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
61e0: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
61f0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6200: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
6210: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
6220: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
6230: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
6240: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
6250: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
6260: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
6270: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
6280: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
6290: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
62a0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
62b0: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
62c0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
62d0: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
62e0: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
62f0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
6300: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
6310: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
6320: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
6330: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
6340: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
6350: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
6360: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
6370: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
6380: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
6390: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
63a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
63b0: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
63c0: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
63d0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
63e0: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
63f0: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
6400: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
6410: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
6420: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
6430: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
6440: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
6450: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
6460: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
6470: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
6480: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
6490: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
64a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
64b0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
64c0: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
64d0: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
64e0: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
64f0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
6500: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
6510: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
6520: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
6530: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
6540: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
6550: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6560: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
6570: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
6580: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
6590: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
65a0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
65b0: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
65c0: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
65d0: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
65e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
65f0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
6600: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
6610: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
6620: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
6630: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
6640: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
6650: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
6660: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
6670: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
6680: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
6690: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
66a0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
66b0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
66c0: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
66d0: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
66e0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
66f0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6700: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6710: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6720: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
6730: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
6740: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
6750: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
6760: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
6770: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6780: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
6790: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
67a0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
67b0: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
67c0: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
67d0: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
67e0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
67f0: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
6800: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
6830: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
6840: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
6850: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
6860: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
6870: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
6880: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
6890: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
68a0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
68b0: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
68c0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
68d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
68e0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
68f0: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
6900: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
6910: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
6920: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
6930: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
6940: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
6950: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
6960: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
6970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
6980: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
6990: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
69a0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
69b0: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
69c0: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
69d0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
69e0: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
69f0: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
6a00: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
6a10: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
6a20: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
6a30: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
6a40: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
6a50: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
6a60: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
6a70: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
6a80: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
6a90: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
6aa0: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
6ab0: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
6ac0: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
6ad0: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
6ae0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
6af0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
6b00: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
6b10: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
6b20: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
6b30: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
6b40: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
6b50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6b60: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
6b70: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
6b80: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
6b90: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
6ba0: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
6bb0: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
6bc0: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
6bd0: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
6be0: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
6bf0: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
6c00: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
6c10: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
6c20: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
6c30: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
6c40: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
6c50: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
6c60: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
6c70: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
6c80: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
6c90: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
6ca0: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
6cb0: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
6cc0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
6cd0: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
6ce0: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
6cf0: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
6d00: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
6d10: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
6d20: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
6d30: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
6d40: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
6d50: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
6d60: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
6d70: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
6d80: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
6d90: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
6da0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
6db0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
6dc0: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
6dd0: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
6de0: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
6df0: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
6e00: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6e10: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
6e20: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
6e30: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
6e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e50: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
6e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6ea0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
6eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ef0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
6f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
6f10: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
6f20: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
6f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6f40: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
6f50: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
6f60: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
6f70: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
6f80: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
6f90: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
6fa0: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
6fb0: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
6fc0: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
6fd0: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
6fe0: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
6ff0: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
7000: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
7010: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
7020: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
7030: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
7040: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
7050: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
7060: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
7070: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
7080: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
7090: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
70a0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
70b0: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
70c0: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
70d0: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
70e0: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
70f0: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
7100: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
7110: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
7120: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
7130: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
7140: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
7150: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
7160: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
7170: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
7180: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
7190: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
71a0: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
71b0: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
71c0: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
71d0: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
71e0: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
71f0: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
7200: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
7210: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
7220: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
7230: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
7240: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
7250: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
7260: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
7270: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
7280: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
7290: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
72a0: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
72b0: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
72c0: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
72d0: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
72e0: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
72f0: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
7300: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
7310: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
7320: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
7330: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
7340: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
7350: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
7360: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
7370: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
7380: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
7390: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
73a0: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
73b0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
73c0: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
73d0: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
73e0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
73f0: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
7400: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
7410: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
7420: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
7430: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7440: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
7450: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
7460: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
7470: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
7480: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
7490: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
74a0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
74b0: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
74c0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
74d0: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
74e0: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
74f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
7500: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
7510: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
7520: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
7530: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
7540: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
7550: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
7560: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
7570: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
7580: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
7590: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
75a0: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
75b0: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
75c0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
75d0: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
75e0: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
75f0: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
7600: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
7610: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
7620: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
7630: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
7640: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
7650: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
7660: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
7670: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
7680: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
7690: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
76a0: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
76b0: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
76c0: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
76d0: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
76e0: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
76f0: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
7700: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
7710: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
7720: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
7730: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
7740: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
7750: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
7760: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
7770: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
7780: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
7790: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
77a0: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
77b0: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
77c0: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
77d0: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
77e0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
77f0: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
7800: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
7810: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
7820: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
7830: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
7840: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
7850: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
7860: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
7870: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
7880: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
7890: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
78a0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
78b0: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
78c0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
78d0: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
78e0: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
78f0: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
7900: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
7910: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
7920: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
7930: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
7940: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
7950: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
7960: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
7970: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
7980: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
7990: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
79a0: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
79b0: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
79c0: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
79d0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
79e0: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
79f0: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
7a00: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
7a10: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
7a20: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
7a30: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
7a40: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
7a50: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
7a60: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
7a70: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
7a80: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
7a90: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
7aa0: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
7ab0: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
7ac0: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
7ad0: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
7ae0: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
7af0: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
7b00: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
7b10: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
7b20: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
7b30: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
7b40: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
7b50: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
7b60: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
7b70: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
7b80: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
7b90: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
7ba0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
7bb0: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
7bc0: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
7bd0: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
7be0: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
7bf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
7c00: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
7c10: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
7c20: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
7c30: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
7c40: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
7c50: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
7c60: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
7c70: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
7c80: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
7c90: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
7ca0: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
7cb0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
7cc0: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
7cd0: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
7ce0: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
7cf0: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
7d00: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
7d10: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
7d20: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
7d30: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
7d40: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
7d50: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
7d60: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
7d70: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
7d80: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
7d90: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
7da0: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
7db0: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
7dc0: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
7dd0: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
7de0: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
7df0: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
7e00: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
7e10: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
7e20: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
7e30: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
7e40: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
7e50: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
7e60: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
7e70: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
7e80: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
7e90: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
7ea0: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
7eb0: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
7ec0: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
7ed0: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
7ee0: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
7ef0: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
7f00: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
7f10: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
7f20: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
7f30: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
7f40: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
7f50: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
7f60: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
7f70: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
7f80: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
7f90: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
7fa0: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
7fb0: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
7fc0: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
7fd0: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
7fe0: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
7ff0: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
8000: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
8010: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
8020: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
8030: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
8040: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
8050: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
8060: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
8070: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
8080: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
8090: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
80a0: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
80b0: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
80c0: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
80d0: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
80e0: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
80f0: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
8100: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
8110: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
8120: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
8130: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
8140: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
8150: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
8160: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
8170: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
8180: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
8190: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
81a0: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
81b0: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
81c0: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
81d0: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
81e0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
81f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8200: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
8210: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
8220: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
8230: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
8240: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
8250: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
8260: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
8270: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
8280: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
8290: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
82a0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
82b0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
82c0: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
82d0: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
82e0: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
82f0: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8310: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
8320: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
8330: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
8340: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
8350: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
8360: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
8370: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
8380: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
8390: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
83a0: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
83b0: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
83c0: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
83d0: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
83e0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
83f0: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
8400: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
8410: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
8420: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
8430: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
8440: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
8450: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
8460: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
8470: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
8480: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
8490: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
84a0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
84b0: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
84c0: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
84d0: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
84e0: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
84f0: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
8500: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8530: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
8540: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
8550: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
8560: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
8570: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
8580: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
8590: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
85a0: 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b  har bProcessLock
85b0: 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c  ;     /* An excl
85c0: 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f  usive process lo
85d0: 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20  ck is held */.  
85e0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8600: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
8610: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
8620: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69  ructure */.  uni
8630: 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
8640: 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
8650: 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  Shared memory as
8660: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
8670: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
8680: 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  t nLock;        
8690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86a0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
86b0: 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  anding file lock
86c0: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
86d0: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
86e0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
86f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8700: 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  s to close */.  
8710: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
8720: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
8730: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
8740: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
8750: 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  ects */.  unixIn
8760: 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20  odeInfo *pPrev; 
8770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
8780: 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b  .... doubly link
8790: 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ed */.#if SQLITE
87a0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
87b0: 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64  STYLE.  unsigned
87c0: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
87d0: 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41  dByte;  /* for A
87e0: 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61  FP simulated sha
87f0: 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64  red lock */.#end
8800: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
8810: 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b  S.  sem_t *pSem;
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8830: 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53      /* Named POS
8840: 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  IX semaphore */.
8850: 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b    char aSemName[
8860: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
8870: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61    /* Name of tha
8880: 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23  t semaphore */.#
8890: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
88a0: 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75  A lists of all u
88b0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
88c0: 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ects..*/.static 
88d0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69  unixInodeInfo *i
88e0: 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  nodeList = 0;../
88f0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
8900: 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45  ction - unixLogE
8910: 72 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c  rror_x(), is onl
8920: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
8930: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75  a the macro.** u
8940: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  nixLogError()..*
8950: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b  *.** It is invok
8960: 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ed after an erro
8970: 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f  r occurs in an O
8980: 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65  S function and e
8990: 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a  rrno has been.**
89a0: 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20   set. It logs a 
89b0: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
89c0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
89d0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
89e0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
89f0: 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73  rrno and, if pos
8a00: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
8a10: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
8a20: 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72  lent from strerr
8a30: 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72  or() or.** strer
8a40: 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ror_r()..**.** T
8a50: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8a60: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
8a70: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
8a80: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
8a90: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
8aa0: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
8ab0: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
8ac0: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
8ad0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
8ae0: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
8af0: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
8b00: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
8b10: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
8b20: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
8b30: 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69  iled (e.g. "unli
8b40: 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64  nk", "open") and
8b50: 20 74 68 65 20 74 68 65 20 61 73 73 6f 63 69 61   the the associa
8b60: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
8b70: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
8b80: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
8b90: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
8ba0: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
8bb0: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
8bc0: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
8bd0: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
8be0: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
8bf0: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
8c00: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
8c10: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
8c20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8c30: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
8c40: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
8c50: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
8c60: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
8c70: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
8c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
8c90: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
8ca0: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
8cb0: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
8ce0: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
8cf0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
8d00: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d20: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
8d30: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
8d40: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
8d50: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
8d60: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
8d70: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
8d80: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
8d90: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
8da0: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
8db0: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
8dc0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
8dd0: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
8de0: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
8df0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
8e00: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
8e10: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
8e20: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
8e30: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
8e40: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
8e50: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
8e60: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
8e70: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
8e80: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
8e90: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
8ea0: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
8eb0: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
8ec0: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
8ed0: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
8ee0: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
8ef0: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
8f00: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
8f10: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
8f20: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
8f30: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
8f40: 72 6f 76 69 64 65 73 20 74 68 65 20 74 68 65 20  rovides the the 
8f50: 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  GNU version of s
8f60: 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74  trerror_r() that
8f70: 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61   .  ** returns a
8f80: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
8f90: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
8fa0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
8fb0: 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20  e. That pointer 
8fc0: 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20  .  ** may point 
8fd0: 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74  to aErr[], or it
8fe0: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f   may point to so
8ff0: 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67  me static storag
9000: 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20  e somewhere. .  
9010: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
9020: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
9030: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
9040: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
9050: 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f  of .  ** strerro
9060: 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77  r_r(), which alw
9070: 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72  ays writes an er
9080: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
9090: 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20   aErr[]..  **.  
90a0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69  ** If the code i
90b0: 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d  ncorrectly assum
90c0: 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  es that it is th
90d0: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
90e0: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61  that is.  ** ava
90f0: 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f  ilable, the erro
9100: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f  r message will o
9110: 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79  ften be an empty
9120: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20   string. Not a. 
9130: 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d   ** huge problem
9140: 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f  . Incorrectly co
9150: 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68  ncluding that th
9160: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73  e GNU version is
9170: 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a   available .  **
9180: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
9190: 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68   segfault though
91a0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
91b0: 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  ed(STRERROR_R_CH
91c0: 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64  AR_P) || defined
91d0: 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45  (__USE_GNU).  zE
91e0: 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20  rr = .# endif.  
91f0: 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e  strerror_r(iErrn
9200: 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28  o, aErr, sizeof(
9210: 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66  aErr)-1);..#elif
9220: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
9230: 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  FE.  /* This is 
9240: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
9250: 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72  ld, but strerror
9260: 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _r() is not avai
9270: 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72  lable. */.  zErr
9280: 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f   = "";.#else.  /
9290: 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65  * Non-threadsafe
92a0: 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65   build, use stre
92b0: 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72  rror(). */.  zEr
92c0: 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72  r = strerror(iEr
92d0: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rno);.#endif..  
92e0: 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21  assert( errcode!
92f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9300: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
9310: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c  Path = "";.  sql
9320: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
9330: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78  ,.      "os_unix
9340: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
9350: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
9360: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
9370: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72  Func, zPath, zEr
9380: 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  r.  );..  return
9390: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
93a0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
93b0: 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
93c0: 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74  * We assume that
93d0: 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20   close() almost 
93e0: 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69  always works, si
93f0: 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69  nce it is only i
9400: 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b  n a.** very sick
9410: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20   application or 
9420: 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70  on a very sick p
9430: 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20  latform that it 
9440: 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49  might fail..** I
9450: 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20  f it does fail, 
9460: 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20  simply leak the 
9470: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
9480: 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a   but do log the.
9490: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
94a0: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
94b0: 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72  not safe to retr
94c0: 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20  y close() after 
94d0: 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a  EINTR since the.
94e0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
94f0: 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c  or might have al
9500: 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65  ready been reuse
9510: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72  d by another thr
9520: 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f  ead..** So we do
9530: 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20  n't even try to 
9540: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20  recover from an 
9550: 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67  EINTR.  Just log
9560: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e   the error.** an
9570: 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74  d move on..*/.st
9580: 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74  atic void robust
9590: 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  _close(unixFile 
95a0: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69  *pFile, int h, i
95b0: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66  nt lineno){.  if
95c0: 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a  ( osClose(h) ){.
95d0: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
95e0: 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f  AtLine(SQLITE_IO
95f0: 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73  ERR_CLOSE, "clos
9600: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
9610: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
9620: 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20   ? pFile->zPath 
9630: 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  : 0, lineno);.  
9640: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
9650: 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69   all file descri
9660: 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64  ptors accumuated
9670: 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64   in the unixInod
9680: 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c  eInfo->pUnused l
9690: 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ist..*/ .static 
96a0: 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e  void closePendin
96b0: 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  gFds(unixFile *p
96c0: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
96d0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
96e0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
96f0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
9700: 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  p;.  UnixUnusedF
9710: 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  d *pNext;.  for(
9720: 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  p=pInode->pUnuse
9730: 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  d; p; p=pNext){.
9740: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
9750: 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74  Next;.    robust
9760: 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d  _close(pFile, p-
9770: 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  >fd, __LINE__);.
9780: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9790: 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64  (p);.  }.  pInod
97a0: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
97b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
97c0: 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f   a unixInodeInfo
97d0: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
97e0: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
97f0: 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  by findInodeInfo
9800: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
9810: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
9820: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
9830: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
9840: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
9850: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
9860: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
9870: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
9880: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e  easeInodeInfo(un
9890: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
98a0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
98b0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
98c0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
98d0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
98e0: 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  () );.  if( ALWA
98f0: 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20  YS(pInode) ){.  
9900: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
9910: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
9920: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
9930: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
9940: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
9950: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  ;.      closePen
9960: 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
9970: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
9980: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
9990: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
99a0: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  e->pPrev->pNext=
99b0: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
99c0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
99d0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
99e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
99f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
9a00: 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d  sert( inodeList=
9a10: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
9a20: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
9a30: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
9a40: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9a50: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b  pInode->pNext ){
9a60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9a70: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
9a80: 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b  pPrev==pInode );
9a90: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
9aa0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
9ab0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20  pInode->pPrev;. 
9ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9ad0: 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65  ite3_free(pInode
9ae0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
9af0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69  /*.** Given a fi
9b00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c  le descriptor, l
9b10: 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e  ocate the unixIn
9b20: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  odeInfo object t
9b30: 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
9b40: 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72   that file descr
9b50: 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61  iptor.  Create a
9b60: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
9b70: 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72  ssary.  The.** r
9b80: 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68  eturn value migh
9b90: 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  t be uninitializ
9ba0: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
9bb0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ccurs..**.** The
9bc0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
9bd0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
9be0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
9bf0: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
9c00: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
9c10: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
9c20: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
9c30: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
9c40: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
9c50: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65  ic int findInode
9c60: 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65  Info(.  unixFile
9c70: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
9c80: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66         /* Unix f
9c90: 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65  ile with file de
9ca0: 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  sc used in the k
9cb0: 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ey */.  unixInod
9cc0: 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20  eInfo **ppInode 
9cd0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
9ce0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
9cf0: 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a  fo object here *
9d00: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20        /* System 
9d30: 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65  call return code
9d40: 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
9d70: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
9d80: 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63  pFile */.  struc
9d90: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
9da0: 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  eId;      /* Loo
9db0: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
9dc0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f  unixInodeInfo */
9dd0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
9de0: 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
9df0: 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
9e00: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
9e10: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
9e20: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20  fo *pInode = 0; 
9e30: 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65      /* Candidate
9e40: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
9e50: 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65  bject */..  asse
9e60: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
9e70: 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  d() );..  /* Get
9e80: 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72   low-level infor
9e90: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
9ea0: 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61   file that we ca
9eb0: 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63  n used to.  ** c
9ec0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e  reate a unique n
9ed0: 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ame for the file
9ee0: 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46  ..  */.  fd = pF
9ef0: 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f  ile->h;.  rc = o
9f00: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
9f10: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
9f20: 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
9f30: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
9f40: 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  o;.#ifdef EOVERF
9f50: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
9f60: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
9f70: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
9f80: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
9f90: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
9fa0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
9fb0: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
9fc0: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
9fd0: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
9fe0: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
9ff0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
a000: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
a010: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
a020: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
a030: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
a040: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
a050: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
a060: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
a070: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
a080: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
a090: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
a0a0: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
a0b0: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
a0c0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
a0d0: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
a0e0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
a0f0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
a100: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
a110: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
a120: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
a130: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
a140: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
a150: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
a160: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
a170: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
a180: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
a190: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
a1a0: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
a1b0: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
a1c0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
a1d0: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
a1e0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
a1f0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
a200: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
a210: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
a220: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
a230: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
a240: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
a250: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
a260: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
a270: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69    do{ rc = osWri
a280: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20  te(fd, "S", 1); 
a290: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
a2a0: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
a2b0: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
a2c0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
a2d0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
a2e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
a2f0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
a300: 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  }.    rc = osFst
a310: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
a320: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
a330: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
a340: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
a350: 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
a360: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
a370: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
a380: 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64    memset(&fileId
a390: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  , 0, sizeof(file
a3a0: 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64  Id));.  fileId.d
a3b0: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
a3c0: 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dev;.#if OS_VXWO
a3d0: 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64  RKS.  fileId.pId
a3e0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23   = pFile->pId;.#
a3f0: 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e  else.  fileId.in
a400: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
a410: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e  no;.#endif.  pIn
a420: 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
a430: 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65  .  while( pInode
a440: 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65   && memcmp(&file
a450: 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  Id, &pInode->fil
a460: 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  eId, sizeof(file
a470: 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  Id)) ){.    pIno
a480: 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
a490: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  xt;.  }.  if( pI
a4a0: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  node==0 ){.    p
a4b0: 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  Inode = sqlite3_
a4c0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
a4d0: 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69  pInode) );.    i
a4e0: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
a4f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a500: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
a510: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f  .    memset(pIno
a520: 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
a530: 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d  Inode));.    mem
a540: 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  cpy(&pInode->fil
a550: 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69  eId, &fileId, si
a560: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
a570: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20     pInode->nRef 
a580: 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  = 1;.    pInode-
a590: 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69  >pNext = inodeLi
a5a0: 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  st;.    pInode->
a5b0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69  pPrev = 0;.    i
a5c0: 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69  f( inodeList ) i
a5d0: 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20  nodeList->pPrev 
a5e0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e  = pInode;.    in
a5f0: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
a600: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
a610: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Inode->nRef++;. 
a620: 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20   }.  *ppInode = 
a630: 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e  pInode;.  return
a640: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
a650: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a660: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
a670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
a680: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
a690: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
a6a0: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
a6b0: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
a6c0: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
a6d0: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
a6e0: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
a6f0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
a700: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
a710: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
a720: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
a730: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
a740: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
a750: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
a760: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
a770: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
a780: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
a790: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
a7a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
a7b0: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
a7c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a7d0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
a7e0: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
a7f0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
a800: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
a810: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
a820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a830: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
a840: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
a850: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
a860: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
a870: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
a880: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
a890: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
a8a0: 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  eads */..  /* Ch
a8b0: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
a8c0: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
a8d0: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
a8e0: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
a8f0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
a900: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
a910: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
a920: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
a930: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
a940: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
a950: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
a960: 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50  /.#ifndef __DJGP
a970: 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72  P__.  if( !reser
a980: 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70  ved && !pFile->p
a990: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
a9a0: 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ock ){.    struc
a9b0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
a9c0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
a9d0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
a9e0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
a9f0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
aa00: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
aa10: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
aa20: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
aa30: 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69   if( osFcntl(pFi
aa40: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
aa50: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
aa60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
aa70: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
aa80: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
aa90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
aaa0: 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
aab0: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
aac0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
aad0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
aae0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
aaf0: 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
ab00: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
ab10: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
ab20: 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29   %d %d %d (unix)
ab30: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
ab40: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
ab50: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
ab60: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
ab70: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
ab80: 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79  empt to set a sy
ab90: 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  stem-lock on the
aba0: 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68   file pFile.  Th
abb0: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65  e lock is .** de
abc0: 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b  scribed by pLock
abd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
abe0: 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  File was opened 
abf0: 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20  read/write from 
ac00: 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20  unix-excl, then 
ac10: 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a  the only lock.**
ac20: 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69   ever obtained i
ac30: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
ac40: 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f  ock, and it is o
ac50: 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20  btained exactly 
ac60: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73  once.** the firs
ac70: 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20  t time any lock 
ac80: 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41  is attempted.  A
ac90: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79  ll subsequent sy
aca0: 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  stem locking.** 
acb0: 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d  operations becom
acc0: 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69  e no-ops.  Locki
acd0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74  ng operations st
ace0: 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72  ill happen inter
acf0: 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64  nally,.** in ord
ad00: 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  er to coordinate
ad10: 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20   access between 
ad20: 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73  separate databas
ad30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
ad40: 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f   within this pro
ad50: 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66  cess, but all of
ad60: 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64   that is handled
ad70: 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74   in memory and t
ad80: 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  he.** operating 
ad90: 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20  system does not 
ada0: 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a  participate..**.
adb0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
adc0: 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75   is a pass-throu
add0: 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45  gh to fcntl(F_SE
ade0: 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73  TLK) if pFile is
adf0: 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46   using.** any VF
ae00: 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e  S other than "un
ae10: 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70  ix-excl" or if p
ae20: 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f  File is opened o
ae30: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a  n "unix-excl".**
ae40: 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c   and is read-onl
ae50: 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  y..**.** Zero is
ae60: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
ae70: 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20   call completes 
ae80: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72  successfully, or
ae90: 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a   -1 if a call.**
aea0: 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c   to fcntl() fail
aeb0: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  s. In this case,
aec0: 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70   errno is set ap
aed0: 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20  propriately (by 
aee0: 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61  fcntl())..*/.sta
aef0: 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
af00: 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
af10: 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f  File, struct flo
af20: 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e  ck *pLock){.  in
af30: 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  t rc;.  unixInod
af40: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
af50: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
af60: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
af70: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73  exHeld() );.  as
af80: 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20  sert( pInode!=0 
af90: 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65  );.  if( ((pFile
afa0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
afb0: 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20  IXFILE_EXCL)!=0 
afc0: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  || pInode->bProc
afd0: 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28  essLock).   && (
afe0: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
aff0: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
b000: 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  NLY)==0).  ){.  
b010: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
b020: 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
b030: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c  .      struct fl
b040: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  ock lock;.      
b050: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
b060: 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  nLock==0 );.    
b070: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
b080: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
b090: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b0a0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
b0b0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
b0c0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
b0d0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
b0e0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
b0f0: 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
b100: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b110: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  , &lock);.      
b120: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
b130: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f  n rc;.      pIno
b140: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
b150: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f   = 1;.      pIno
b160: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
b170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
b180: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
b190: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  lse{.    rc = os
b1a0: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
b1b0: 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b  F_SETLK, pLock);
b1c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b1d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
b1e0: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
b1f0: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
b200: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
b210: 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
b220: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b230: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
b240: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
b250: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
b260: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
b270: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
b280: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
b290: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
b2a0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
b2b0: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
b2c0: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
b2d0: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
b2e0: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
b2f0: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
b300: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
b310: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
b320: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
b330: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
b340: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
b350: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
b360: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
b370: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
b380: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
b390: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
b3a0: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
b3b0: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
b3c0: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
b3d0: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
b3e0: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
b3f0: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
b400: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
b410: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
b420: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
b430: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
b440: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
b450: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
b460: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
b470: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
b480: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
b490: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
b4a0: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
b4b0: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
b4c0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
b4d0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
b4e0: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
b4f0: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
b500: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c  int unixLock(sql
b510: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
b520: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
b530: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
b540: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
b550: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
b560: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
b570: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
b580: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
b590: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
b5a0: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
b5b0: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
b5c0: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
b5d0: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
b5e0: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
b5f0: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
b600: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
b610: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
b620: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
b630: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
b640: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
b650: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
b660: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
b670: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
b680: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
b690: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
b6a0: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
b6b0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
b6c0: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
b6d0: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
b6e0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
b6f0: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
b700: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
b710: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
b720: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
b730: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
b740: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
b750: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
b760: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
b770: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
b780: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
b790: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
b7a0: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
b7b0: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
b7c0: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
b7d0: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
b7e0: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
b7f0: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
b800: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
b810: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
b820: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
b830: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
b840: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
b850: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
b860: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
b870: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
b880: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
b890: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
b8a0: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
b8b0: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
b8c0: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
b8d0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
b8e0: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
b8f0: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
b900: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
b910: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
b920: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
b930: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
b940: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
b950: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
b960: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
b970: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
b980: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
b990: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
b9a0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
b9b0: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
b9c0: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
b9d0: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
b9e0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
b9f0: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
ba00: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
ba10: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
ba20: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
ba30: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
ba40: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
ba50: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
ba60: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
ba70: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
ba80: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
ba90: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
baa0: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
bab0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
bac0: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
bad0: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
bae0: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
baf0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
bb00: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
bb10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
bb20: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
bb30: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
bb40: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
bb50: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
bb60: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
bb70: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
bb80: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
bb90: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
bba0: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
bbb0: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
bbc0: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
bbd0: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
bbe0: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
bbf0: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
bc00: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
bc10: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
bc20: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
bc30: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
bc40: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
bc50: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
bc60: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
bc70: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
bc80: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
bc90: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
bca0: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
bcb0: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
bcc0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
bcd0: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
bce0: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
bcf0: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
bd00: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
bd10: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
bd20: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
bd30: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
bd40: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
bd50: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
bd60: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
bd70: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bd80: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
bd90: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
bda0: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
bdb0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
bdc0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
bdd0: 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  k;.  int tErrno 
bde0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
bdf0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
be00: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
be10: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
be20: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
be30: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
be40: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
be50: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
be60: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
be70: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
be80: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
be90: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
bea0: 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  k), pFile->pInod
beb0: 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
bec0: 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
bed0: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
bee0: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
bef0: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
bf00: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
bf10: 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
bf20: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
bf30: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
bf40: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
bf50: 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
bf60: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
bf70: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
bf80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
bf90: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
bfa0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
bfb0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
bfc0: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
bfd0: 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c  dy held) (unix)\
bfe0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
bff0: 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
c000: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
c010: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c020: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
c030: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
c040: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
c050: 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  e is correct..  
c060: 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
c070: 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
c080: 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
c090: 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
c0a0: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
c0b0: 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
c0c0: 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
c0d0: 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
c0e0: 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
c0f0: 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
c100: 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
c110: 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
c120: 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
c130: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
c140: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
c150: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
c160: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
c170: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
c180: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
c190: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
c1a0: 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
c1b0: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
c1c0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
c1d0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
c1e0: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
c1f0: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
c200: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
c210: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
c220: 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
c230: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
c240: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
c250: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
c260: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
c270: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
c280: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
c290: 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
c2a0: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
c2b0: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
c2c0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
c2d0: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
c2e0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
c2f0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
c300: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
c310: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
c320: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
c330: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
c340: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
c350: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
c360: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
c370: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
c380: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
c390: 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
c3a0: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
c3b0: 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
c3c0: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
c3d0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
c3e0: 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
c3f0: 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
c400: 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
c410: 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
c420: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
c430: 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
c440: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
c450: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
c460: 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
c470: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c480: 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
c490: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
c4a0: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
c4b0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
c4c0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c4d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
c4e0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
c4f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c500: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
c510: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
c520: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
c530: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
c540: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
c550: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
c560: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
c570: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20  d_lock;.  }...  
c580: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
c590: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
c5a0: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
c5b0: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
c5c0: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
c5d0: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
c5e0: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
c5f0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
c600: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
c610: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
c620: 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  */.  lock.l_l
c630: 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e  en = 1L;.  lock.
c640: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
c650: 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65  SET;.  if( eFile
c660: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c670: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
c680: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
c690: 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
c6a0: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
c6b0: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
c6c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c6d0: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
c6e0: 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a  ED_LOCK?F_RDLCK:
c6f0: 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f  F_WRLCK);.    lo
c700: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
c710: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69  DING_BYTE;.    i
c720: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
c730: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
c740: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
c750: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
c760: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
c770: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
c780: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
c790: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
c7a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
c7b0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
c7c0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c7d0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
c7e0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
c7f0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
c800: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
c810: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
c820: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
c830: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
c840: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
c850: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
c860: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
c870: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
c880: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
c890: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
c8a0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c8b0: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
c8c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
c8d0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
c8e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c8f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
c900: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
c910: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
c920: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
c930: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
c940: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
c950: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
c960: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
c970: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
c980: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
c990: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c9a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
c9b0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
c9c0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
c9d0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
c9e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70    }..    /* Drop
c9f0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
ca00: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
ca10: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
ca20: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
ca30: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ca40: 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f   1L;.    lock.l_
ca50: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
ca60: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
ca70: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
ca80: 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  k) && rc==SQLITE
ca90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
caa0: 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65  This could happe
cab0: 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b  n with a network
cac0: 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   mount */.      
cad0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
cae0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
caf0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
cb00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
cb10: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
cb20: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
cb30: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
cb40: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
cb50: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
cb60: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
cb70: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
cb80: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
cb90: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
cba0: 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
cbb0: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
cbc0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
cbd0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
cbe0: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
cbf0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
cc00: 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
cc10: 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
cc20: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
cc30: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
cc40: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
cc50: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
cc60: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
cc70: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
cc80: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
cc90: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
cca0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
ccb0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
ccc0: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
ccd0: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
cce0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
ccf0: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
cd00: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
cd10: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
cd20: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
cd30: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
cd40: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
cd50: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
cd60: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
cd70: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
cd80: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20  e = F_WRLCK;..  
cd90: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
cda0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
cdb0: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
cdc0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
cdd0: 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  );.    if( eFile
cde0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
cdf0: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  OCK ){.      loc
ce00: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
ce10: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
ce20: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
ce30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ce40: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
ce50: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
ce60: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
ce70: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
ce80: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
ce90: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
cea0: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
ceb0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
cec0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
ced0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
cee0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
cef0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
cf00: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
cf10: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
cf20: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
cf30: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
cf40: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
cf50: 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65  }.  }.  ..#ifnde
cf60: 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65  f NDEBUG.  /* Se
cf70: 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  t up the transac
cf80: 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61  tion-counter cha
cf90: 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61  nge checking fla
cfa0: 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61  gs when.  ** tra
cfb0: 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
cfc0: 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45  a SHARED to a RE
cfd0: 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68  SERVED lock.  Th
cfe0: 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72  e change.  ** fr
cff0: 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  om SHARED to RES
d000: 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20  ERVED marks the 
d010: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e  beginning of a n
d020: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65  ormal.  ** write
d030: 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20   operation (not 
d040: 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  a hot journal ro
d050: 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20  llback)..  */.  
d060: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d070: 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65  K.   && pFile->e
d080: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
d090: 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c  _LOCK.   && eFil
d0a0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
d0b0: 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46  LOCK.  ){.    pF
d0c0: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
d0d0: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ng = 0;.    pFil
d0e0: 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  e->dbUpdate = 0;
d0f0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
d100: 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20  rmalWrite = 1;. 
d110: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66   }.#endif...  if
d120: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d130: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
d140: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
d150: 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
d160: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
d170: 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
d180: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
d190: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
d1a0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
d1b0: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
d1c0: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
d1d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
d1e0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
d1f0: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  .end_lock:.  uni
d200: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
d210: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
d220: 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69     %d %s %s (uni
d230: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
d240: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
d250: 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72  eLock), .      r
d260: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
d270: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
d280: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d290: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
d2a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d2b0: 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e  used by file han
d2c0: 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65  dle pFile to the
d2d0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
d2e0: 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  * pUnused list..
d2f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
d300: 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78  etPendingFd(unix
d310: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
d320: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
d330: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
d340: 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75  Inode;.  UnixUnu
d350: 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65  sedFd *p = pFile
d360: 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e  ->pUnused;.  p->
d370: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
d380: 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64  pUnused;.  pInod
d390: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a  e->pUnused = p;.
d3a0: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
d3b0: 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  .  pFile->pUnuse
d3c0: 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d = 0;.}../*.** 
d3d0: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
d3e0: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
d3f0: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
d400: 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
d410: 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
d420: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
d430: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
d440: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
d450: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
d460: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
d470: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
d480: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
d490: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
d4a0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
d4b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
d4c0: 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  o-op..** .** If 
d4d0: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
d4e0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e  is true, then on
d4f0: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20   downgrading an 
d500: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74  EXCLUSIVE_LOCK t
d510: 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20  o SHARED.** the 
d520: 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69  byte range is di
d530: 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72  vided into 2 par
d540: 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ts and the first
d550: 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65   part is unlocke
d560: 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f  d then.** set to
d570: 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68   a read lock, th
d580: 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72  en the other par
d590: 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f  t is simply unlo
d5a0: 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b  cked.  This work
d5b0: 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62  s .** around a b
d5c0: 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f  ug in BSD NFS lo
d5d0: 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f  ckd (also seen o
d5e0: 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20  n MacOSX 10.3+) 
d5f0: 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a  that fails to .*
d600: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69  * remove the wri
d610: 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67  te lock on a reg
d620: 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20  ion when a read 
d630: 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  lock is set..*/.
d640: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
d650: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
d660: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
d670: 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64  leLock, int hand
d680: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20  leNFSUnlock){.  
d690: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
d6a0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
d6b0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
d6c0: 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75   *pInode;.  stru
d6d0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
d6e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d6f0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
d700: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
d710: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
d720: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
d730: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
d740: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
d750: 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46  leLock,.      pF
d760: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
d770: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
d780: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
d790: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
d7a0: 2c 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29  ,.      getpid()
d7b0: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
d7c0: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
d7d0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
d7e0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
d7f0: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
d800: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d810: 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
d820: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
d830: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
d840: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
d850: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
d860: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
d870: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
d880: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
d890: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d8a0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
d8b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a  ->eFileLock );..
d8c0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
d8d0: 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
d8e0: 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
d8f0: 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
d900: 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
d910: 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68     ** reading th
d920: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d930: 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65  again, make sure
d940: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
d950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
d960: 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
d970: 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
d980: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
d990: 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64   ** file changed
d9a0: 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
d9b0: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
d9c0: 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20   not updated,.  
d9d0: 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
d9e0: 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61  ctions to the sa
d9f0: 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f  me file might no
da00: 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20  t realize that. 
da10: 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68     ** the file h
da20: 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68  as changed and h
da30: 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b  ence might not k
da40: 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65  now to flush the
da50: 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  ir.    ** cache.
da60: 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
da70: 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
da80: 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
da90: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
daa0: 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  */.    pFile->in
dab0: 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
dac0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
dad0: 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61  downgrading to a
dae0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
daf0: 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65  NFS involves cle
db00: 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20  aring the write 
db10: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lock.    ** befo
db20: 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20  re establishing 
db30: 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74  the readlock - t
db40: 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63  o avoid a race c
db50: 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e  ondition we down
db60: 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  grade.    ** the
db70: 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b   lock in 2 block
db80: 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20  s, so that part 
db90: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c  of the range wil
dba0: 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20  l be covered by 
dbb0: 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  a .    ** write 
dbc0: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72  lock until the r
dbd0: 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62  est is covered b
dbe0: 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20  y a read lock:. 
dbf0: 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57     **  1:   [WWW
dc00: 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20  WW].    **  2:  
dc10: 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20   [....W].    ** 
dc20: 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20   3:   [RRRRW].  
dc30: 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52    **  4:   [RRRR
dc40: 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .].    */.    if
dc50: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
dc60: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66  RED_LOCK ){..#if
dc70: 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c   !defined(__APPL
dc80: 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f  E__) || !SQLITE_
dc90: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
dca0: 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64  TYLE.      (void
dcb0: 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b  )handleNFSUnlock
dcc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
dcd0: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d  handleNFSUnlock=
dce0: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =0 );.#endif.#if
dcf0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
dd00: 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
dd10: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
dd20: 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e  LE.      if( han
dd30: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a  dleNFSUnlock ){.
dd40: 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
dd50: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
dd60: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
dd70: 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c  from system call
dd80: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20   errors */.     
dd90: 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65     off_t divSize
dda0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d   = SHARED_SIZE -
ddb0: 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   1;.        .   
ddc0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
ddd0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
dde0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
ddf0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
de00: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
de10: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
de20: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
de30: 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
de40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
de50: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
de60: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
de70: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
de80: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
de90: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
dea0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
deb0: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
dec0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
ded0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
dee0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
def0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
df00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
df10: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
df20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df30: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
df40: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
df50: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
df60: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
df70: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
df80: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
df90: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
dfa0: 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20  en = divSize;.  
dfb0: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
dfc0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
dfd0: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
dfe0: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
dff0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
e000: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
e010: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
e020: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
e030: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20  IOERR_RDLOCK);. 
e040: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
e050: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
e060: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
e070: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
e080: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
e090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
e0a0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
e0b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e0c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e0d0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
e0e0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
e0f0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
e100: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e110: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64  = SHARED_FIRST+d
e120: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
e130: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
e140: 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65  RED_SIZE-divSize
e150: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
e160: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
e170: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
e180: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
e190: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e1a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e1b0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
e1c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
e1d0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
e1e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
e1f0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
e200: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
e210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e220: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
e230: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e240: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
e250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
e260: 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
e270: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
e280: 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20  LE */.      {.  
e290: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
e2a0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
e2b0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
e2c0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
e2d0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
e2e0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
e2f0: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
e300: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
e310: 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66  SIZE;.        if
e320: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
e330: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
e340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
e350: 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c  theory, the call
e360: 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b   to unixFileLock
e370: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62  () cannot fail b
e380: 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20  ecause another. 
e390: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
e3a0: 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ess is holding a
e3b0: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c  n incompatible l
e3c0: 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  ock. If it does,
e3d0: 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
e3e0: 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68   ** indicates th
e3f0: 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f  at the other pro
e400: 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
e410: 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e  owing the lockin
e420: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  g.          ** p
e430: 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73  rotocol. If this
e440: 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e   happens, return
e450: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
e460: 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a  LOCK. Returning.
e470: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
e480: 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63  ITE_BUSY would c
e490: 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72  onfuse the upper
e4a0: 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74   layer (in pract
e4b0: 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20  ice it causes . 
e4c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61           ** an a
e4d0: 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20  ssert to fail). 
e4e0: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  */ .          rc
e4f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
e500: 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  RDLOCK;.        
e510: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e520: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e530: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
e540: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
e550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e560: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
e570: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
e580: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e590: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
e5a0: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
e5b0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
e5c0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
e5d0: 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
e5e0: 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
e5f0: 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
e600: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e610: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
e620: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
e630: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
e640: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
e650: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
e660: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
e670: 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
e680: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
e690: 6f 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  o;.      goto en
e6a0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  d_unlock;.    }.
e6b0: 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c    }.  if( eFileL
e6c0: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock==NO_LOCK ){.
e6d0: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
e6e0: 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
e6f0: 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
e700: 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
e710: 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
e720: 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
e730: 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
e740: 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
e750: 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
e760: 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
e770: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
e780: 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
e790: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
e7a0: 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
e7b0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
e7c0: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63  UNLCK;.      loc
e7d0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
e7e0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
e7f0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b  k.l_start = lock
e800: 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20  .l_len = 0L;.   
e810: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e820: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e830: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e840: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e850: 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
e860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e870: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e880: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 09 70 46 69  ERR_UNLOCK;..pFi
e890: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e8a0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70  errno;.        p
e8b0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e8c0: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
e8d0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e8e0: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
e8f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
e900: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
e910: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63  the count of loc
e920: 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  ks against this 
e930: 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e  same file.  When
e940: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e   the.    ** coun
e950: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20  t reaches zero, 
e960: 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20  close any other 
e970: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
e980: 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20   whose close.   
e990: 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64   ** was deferred
e9a0: 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73   because of outs
e9b0: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20  tanding locks.. 
e9c0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
e9d0: 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
e9e0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
e9f0: 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
ea00: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
ea10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f  ==0 ){.      clo
ea20: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
ea30: 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 09  le);.    }.  }..
ea40: 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75  .end_unlock:.  u
ea50: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
ea60: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ea70: 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
ea80: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
ea90: 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
eaa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
eab0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
eac0: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
ead0: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
eae0: 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
eaf0: 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
eb00: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
eb10: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
eb20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
eb30: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
eb40: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
eb50: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
eb60: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
eb70: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
eb80: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
eb90: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
eba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
ebb0: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
ebc0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
ebd0: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
ebe0: 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
ebf0: 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
ec00: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
ec10: 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
ec20: 72 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66  rms the parts of
ec30: 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65   the "close file
ec40: 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20  " operation .** 
ec50: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
ec60: 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49  cking schemes. I
ec70: 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72  t closes the dir
ec80: 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a  ectory and file.
ec90: 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74  ** handles, if t
eca0: 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61  hey are valid, a
ecb0: 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c  nd sets all fiel
ecc0: 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ds of the unixFi
ecd0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
ece0: 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  to 0..**.** It i
ecf0: 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72  s *not* necessar
ed00: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  y to hold the mu
ed10: 74 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f  tex when this ro
ed20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
ed30: 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f  .** even on VxWo
ed40: 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69  rks.  A mutex wi
ed50: 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f  ll be acquired o
ed60: 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65  n VxWorks by the
ed70: 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  .** vxworksRelea
ed80: 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69  seFileId() routi
ed90: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
eda0: 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  t closeUnixFile(
edb0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
edc0: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
edd0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
ede0: 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c  *)id;.  if( pFil
edf0: 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72  e->h>=0 ){.    r
ee00: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
ee10: 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
ee20: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c  INE__);.    pFil
ee30: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  e->h = -1;.  }.#
ee40: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
ee50: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29  if( pFile->pId )
ee60: 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  {.    if( pFile-
ee70: 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  >isDelete ){.   
ee80: 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c     osUnlink(pFil
ee90: 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  e->pId->zCanonic
eea0: 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  alName);.    }. 
eeb0: 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73     vxworksReleas
eec0: 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70  eFileId(pFile->p
eed0: 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  Id);.    pFile->
eee0: 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  pId = 0;.  }.#en
eef0: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
ef00: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
ef10: 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
ef20: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
ef30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ef40: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
ef50: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
ef60: 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
ef70: 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
ef80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ef90: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
efa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
efb0: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
efc0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
efd0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
efe0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
eff0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
f000: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f  *)id;.  unixUnlo
f010: 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
f020: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
f030: 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46  x();..  /* unixF
f040: 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c  ile.pInode is al
f050: 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e  ways valid here.
f060: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69   Otherwise, a di
f070: 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20  fferent close.  
f080: 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e  ** routine (e.g.
f090: 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20   nolockClose()) 
f0a0: 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  would be called 
f0b0: 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  instead..  */.  
f0c0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
f0d0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
f0e0: 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
f0f0: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
f100: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
f110: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20  (pFile->pInode) 
f120: 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
f130: 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
f140: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
f150: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
f160: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
f170: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
f180: 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
f190: 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
f1a0: 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
f1b0: 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
f1c0: 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
f1d0: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
f1e0: 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
f1f0: 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
f200: 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
f210: 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a  ly closed .    *
f220: 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
f230: 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
f240: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50  .    */.    setP
f250: 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
f260: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e  .  }.  releaseIn
f270: 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
f280: 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
f290: 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
f2a0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
f2b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f2c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
f2d0: 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
f2e0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
f2f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
f300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
f360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
f3d0: 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
f3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f400: 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
f410: 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
f420: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
f430: 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
f440: 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
f450: 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
f460: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
f470: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
f480: 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
f490: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
f4a0: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
f4b0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
f4c0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
f4d0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
f4e0: 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
f4f0: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
f500: 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
f510: 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
f520: 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
f530: 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
f540: 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
f550: 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
f560: 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
f570: 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
f580: 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
f590: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
f5a0: 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
f5b0: 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
f5c0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
f5d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
f5e0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
f5f0: 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
f600: 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
f610: 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
f620: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
f630: 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
f640: 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
f650: 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
f660: 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
f670: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
f680: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
f690: 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
f6a0: 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
f6b0: 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
f6c0: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
f6d0: 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
f6e0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
f6f0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
f700: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
f710: 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
f720: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
f730: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
f740: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
f750: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f760: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
f770: 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
f780: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
f790: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
f7a0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
f7b0: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
f7c0: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
f7d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f7e0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f7f0: 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
f800: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
f810: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
f820: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
f830: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
f840: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
f850: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f860: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
f870: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f880: 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
f890: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
f8a0: 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
f8b0: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
f8c0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
f8d0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
f8e0: 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
f8f0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
f900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
f960: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
f970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9b0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
f9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
f9d0: 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
f9e0: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
f9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
fa10: 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
fa20: 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
fa30: 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
fa40: 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
fa50: 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61   files (really a
fa60: 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63   directory) to c
fa70: 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
fa80: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
fa90: 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e  This works.** on
faa0: 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72   just about ever
fab0: 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
fac0: 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
fad0: 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
fae0: 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
faf0: 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
fb00: 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
fb10: 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
fb20: 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
fb30: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
fb40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
fb50: 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
fb60: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
fb70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
fb80: 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
fb90: 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
fba0: 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
fbb0: 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
fbc0: 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
fbd0: 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
fbe0: 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
fbf0: 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
fc00: 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
fc10: 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
fc20: 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
fc30: 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
fc40: 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
fc50: 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
fc60: 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
fc70: 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
fc80: 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
fc90: 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63  ating a subdirec
fca0: 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65  tory in the same
fcb0: 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a   directory as.**
fcc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
fcd0: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
fce0: 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
fcf0: 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
fd00: 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
fd10: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c  existance of a l
fd20: 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d  ock directory im
fd30: 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
fd40: 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
fd50: 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65  her.** lock type
fd60: 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
fd70: 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
fd80: 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
fd90: 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
fda0: 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
fdb0: 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
fdc0: 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
fdd0: 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
fde0: 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
fdf0: 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a  k directory..*/.
fe00: 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
fe10: 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
fe20: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
fe30: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
fe40: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
fe50: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
fe60: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
fe70: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
fe80: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
fe90: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
fea0: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
feb0: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
fec0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
fed0: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
fee0: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
fef0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
ff00: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
ff10: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
ff20: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
ff30: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
ff40: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
ff50: 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
ff60: 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
ff70: 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
ff80: 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
ff90: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
ffa0: 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
ffb0: 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
ffc0: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
ffd0: 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
ffe0: 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
fff0: 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
10000 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
10010 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
10020 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
10030 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
10040 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10050 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
10060 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
10070 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
10080 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
10090 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
100a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
100b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
100c0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
100d0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
100e0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
100f0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
10100 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
10110 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
10120 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
10130 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
10140 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
10150 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
10160 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  CK ){.    /* Eit
10170 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  her this connect
10180 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ion or some othe
10190 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  r connection in 
101a0 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
101b0 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20  .    ** holds a 
101c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
101d0 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68  .  No need to ch
101e0 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a  eck further. */.
101f0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
10200 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10210 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  * The lock is he
10220 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ld if and only i
10230 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65  f the lockfile e
10240 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  xists */.    con
10250 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  st char *zLockFi
10260 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
10270 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
10280 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73  Context;.    res
10290 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73  erved = osAccess
102a0 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d  (zLockFile, 0)==
102b0 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  0;.  }.  OSTRACE
102c0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
102d0 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63  %d %d %d (dotloc
102e0 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
102f0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
10300 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
10310 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
10320 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
10330 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
10340 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
10350 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
10360 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
10370 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
10380 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
10390 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
103a0 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
103b0 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
103c0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
103d0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
103e0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
103f0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
10400 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
10410 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
10420 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
10430 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
10440 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
10450 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
10460 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
10470 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
10480 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
10490 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
104a0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
104b0 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
104c0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
104d0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
104e0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
104f0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
10500 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
10510 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
10520 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
10530 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
10540 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
10550 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
10560 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
10570 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
10580 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
10590 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
105a0 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
105b0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
105c0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
105d0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
105e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
105f0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
10600 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
10610 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
10620 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
10630 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
10640 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57  g level..**.** W
10650 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b  ith dotfile lock
10660 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f  ing, we really o
10670 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74  nly support stat
10680 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45  e (4): EXCLUSIVE
10690 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63  ..** But we trac
106a0 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b  k the other lock
106b0 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72  ing levels inter
106c0 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  nally..*/.static
106d0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   int dotlockLock
106e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
106f0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
10700 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
10710 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10720 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
10730 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
10740 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
10750 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
10760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10770 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
10780 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
10790 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
107a0 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
107b0 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
107c0 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
107d0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
107e0 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
107f0 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
10800 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
10810 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b  ock > NO_LOCK ){
10820 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
10830 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
10840 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  k;.    /* Always
10850 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
10860 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
10870 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20   file */.#ifdef 
10880 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75  HAVE_UTIME.    u
10890 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  time(zLockFile, 
108a0 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20  NULL);.#else.   
108b0 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
108c0 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  e, NULL);.#endif
108d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
108e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
108f0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
10900 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72  sive lock */.  r
10910 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63  c = osMkdir(zLoc
10920 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20  kFile, 0777);.  
10930 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
10940 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* failed to ope
10950 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63  n/create the loc
10960 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  k directory */. 
10970 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
10980 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
10990 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
109a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
109b0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
109c0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
109d0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
109e0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
109f0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10a00 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
10a10 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
10a20 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
10a30 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10a40 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
10a50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
10a60 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a  urn rc;.  } .  .
10a70 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
10a80 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
10a90 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
10aa0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
10ab0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
10ac0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10ad0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
10ae0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
10af0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
10b00 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
10b10 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
10b20 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
10b30 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
10b40 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
10b50 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
10b60 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
10b70 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
10b80 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
10b90 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
10ba0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
10bb0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10bc0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
10bd0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
10be0 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
10bf0 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
10c00 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
10c10 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
10c20 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
10c30 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
10c40 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
10c50 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
10c60 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
10c70 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
10c80 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
10c90 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
10ca0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
10cb0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
10cc0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
10cd0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
10ce0 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
10cf0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
10d00 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69  ileLock,..   pFi
10d10 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
10d20 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
10d30 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
10d40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
10d50 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
10d60 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
10d70 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
10d80 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
10d90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10da0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
10db0 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f   To downgrade to
10dc0 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20   shared, simply 
10dd0 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
10de0 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68  nal notion of th
10df0 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  e.  ** lock stat
10e00 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d  e.  No need to m
10e10 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c  ess with the fil
10e20 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  e on disk..  */.
10e30 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
10e40 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
10e50 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
10e60 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
10e70 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
10e80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10e90 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75  .  /* To fully u
10ea0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
10eb0 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  se, delete the l
10ec0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73  ock file */.  as
10ed0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
10ee0 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63  =NO_LOCK );.  rc
10ef0 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b   = osRmdir(zLock
10f00 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c  File);.  if( rc<
10f10 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  0 && errno==ENOT
10f20 44 49 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c  DIR ) rc = osUnl
10f30 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a  ink(zLockFile);.
10f40 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
10f50 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
10f60 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30  rrno;.    rc = 0
10f70 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54  ;.    if( ENOENT
10f80 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   != tErrno ){.  
10f90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10fa0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
10fb0 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
10fc0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
10fd0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
10fe0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
10ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
11000 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
11010 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11020 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
11030 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11040 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
11050 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ile.  Make sure 
11060 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
11070 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72  n released befor
11080 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e closing..*/.st
11090 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
110a0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
110b0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
110c0 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  rc;.  if( id ){.
110d0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
110e0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
110f0 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b  )id;.    dotlock
11100 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
11110 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  CK);.    sqlite3
11120 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
11130 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
11140 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  }.  rc = closeUn
11150 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65  ixFile(id);.  re
11160 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a  turn rc;.}./****
11170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
11180 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69  nd of the dot-fi
11190 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  le lock implemen
111a0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
111b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
111c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
11210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11270 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f  ****** Begin flo
11280 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ck Locking *****
11290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
112b0 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28  * Use the flock(
112c0 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  ) system call to
112d0 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   do file locking
112e0 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  ..**.** flock() 
112f0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
11300 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  dot-file locking
11310 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72   in that the var
11320 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61  ious.** fine-gra
11330 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  in locking level
11340 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53  s supported by S
11350 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70  QLite are collap
11360 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  sed into.** a si
11370 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c  ngle exclusive l
11380 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ock.  In other w
11390 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45  ords, SHARED, RE
113a0 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50  SERVED, and.** P
113b0 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65  ENDING locks are
113c0 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20   the same thing 
113d0 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  as an EXCLUSIVE 
113e0 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a  lock.  SQLite.**
113f0 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65   still works whe
11400 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62  n you do this, b
11410 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69  ut concurrency i
11420 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a  s reduced since.
11430 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
11440 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20   process can be 
11450 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
11460 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a  base at a time..
11470 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20  **.** Omit this 
11480 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  section if SQLIT
11490 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
114a0 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64  _STYLE is turned
114b0 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f   off or if.** co
114c0 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f  mpiling for VXWO
114d0 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  RKS..*/.#if SQLI
114e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
114f0 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
11500 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65  XWORKS../*.** Re
11510 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c  try flock() call
11520 73 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68  s that fail with
11530 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66   EINTR.*/.#ifdef
11540 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e   EINTR.static in
11550 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69  t robust_flock(i
11560 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a  nt fd, int op){.
11570 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20    int rc;.  do{ 
11580 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70  rc = flock(fd,op
11590 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
115a0 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
115b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
115c0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
115d0 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c   robust_flock(a,
115e0 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65  b) flock(a,b).#e
115f0 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a  ndif.     ../*.*
11600 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
11610 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
11620 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
11630 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
11640 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
11650 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
11660 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
11670 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
11680 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
11690 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
116a0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
116b0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
116c0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
116d0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
116e0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
116f0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
11700 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
11710 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
11720 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
11730 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52   int flockCheckR
11740 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
11750 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
11760 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
11770 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11780 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
11790 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
117a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
117b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53  File*)id;.  .  S
117c0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
117d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
117e0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
117f0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
11800 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
11810 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
11820 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
11830 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
11840 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
11850 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
11860 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
11870 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
11880 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
11890 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
118a0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
118b0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
118c0 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
118d0 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74  ved ){.    /* at
118e0 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  tempt to get the
118f0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
11900 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c   lrc = robust_fl
11910 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
11920 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
11930 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29  ;.    if( !lrc )
11940 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74  {.      /* got t
11950 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  he lock, unlock 
11960 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  it */.      lrc 
11970 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
11980 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
11990 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72  );.      if ( lr
119a0 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  c ) {.        in
119b0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
119c0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c  ;.        /* unl
119d0 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20  ock failed with 
119e0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
119f0 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45      lrc = SQLITE
11a00 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a  _IOERR_UNLOCK; .
11a10 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
11a20 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
11a30 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
11a40 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
11a50 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  Errno;.         
11a60 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
11a70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11a80 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
11a90 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11aa0 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76  no;.      reserv
11ab0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  ed = 1;.      /*
11ac0 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69   someone else mi
11ad0 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65  ght have it rese
11ae0 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72  rved */.      lr
11af0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
11b00 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
11b10 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
11b20 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20  RR_LOCK); .     
11b30 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
11b40 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
11b50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11b60 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
11b70 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
11b80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11b90 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
11ba0 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
11bb0 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %d (flock)\n", 
11bc0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
11bd0 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65  served));..#ifde
11be0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
11bf0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
11c00 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
11c10 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
11c20 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
11c30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
11c40 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d  K;.    reserved=
11c50 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  1;.  }.#endif /*
11c60 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
11c70 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
11c80 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d   */.  *pResOut =
11c90 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
11ca0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11cb0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
11cc0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
11cd0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
11ce0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
11cf0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
11d00 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
11d10 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
11d20 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
11d30 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
11d40 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
11d50 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
11d60 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
11d70 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
11d80 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
11d90 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
11da0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
11db0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
11dc0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
11dd0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
11de0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
11df0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
11e00 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
11e10 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
11e20 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
11e30 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
11e40 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
11e50 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
11e60 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
11e70 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
11e80 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
11e90 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
11ea0 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
11eb0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
11ec0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
11ed0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
11ee0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
11ef0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
11f00 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
11f10 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11f20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
11f30 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
11f40 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
11f50 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11f60 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79  .** flock() only
11f70 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
11f80 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
11f90 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
11fa0 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
11fb0 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
11fc0 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
11fd0 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
11fe0 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
11ff0 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
12000 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
12010 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
12020 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
12030 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
12040 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
12050 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
12060 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
12070 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
12080 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
12090 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
120a0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
120b0 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
120c0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b  ic int flockLock
120d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
120e0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
120f0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
12100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
12110 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12120 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
12130 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12140 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
12150 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
12160 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
12170 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
12180 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
12190 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
121a0 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
121b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
121c0 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
121d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
121e0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
121f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12200 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
12210 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
12220 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66   lock */.  .  if
12230 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70   (robust_flock(p
12240 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
12250 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
12260 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
12270 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
12280 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
12290 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
122a0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
122b0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
122c0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
122d0 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
122e0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
122f0 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
12300 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
12310 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  Errno;.    }.  }
12320 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
12330 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
12340 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
12350 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
12360 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
12370 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54  eLock;.  }.  OST
12380 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
12390 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c  d %s %s (flock)\
123a0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
123b0 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
123c0 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ck), .          
123d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
123e0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
123f0 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
12400 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12410 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
12420 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
12430 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
12440 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
12450 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
12460 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12470 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
12480 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
12490 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
124a0 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
124b0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
124c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
124d0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
124e0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
124f0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
12500 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
12510 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
12520 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
12530 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
12540 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
12550 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
12560 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
12570 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
12580 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
12590 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
125a0 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55  tatic int flockU
125b0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
125c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
125d0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
125e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
125f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
12600 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12610 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
12620 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
12630 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b  %d pid=%d (flock
12640 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12650 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
12660 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
12670 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
12680 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
12690 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
126a0 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
126b0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
126c0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
126d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
126e0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
126f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12700 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
12710 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
12720 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
12730 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
12740 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
12750 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
12760 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
12770 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
12780 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
12790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
127a0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
127b0 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b  , really, unlock
127c0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73  . */.  if( robus
127d0 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
127e0 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69  , LOCK_UN) ){.#i
127f0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
12800 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
12810 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20  RORS.    return 
12820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
12830 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
12840 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
12850 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75  RORS */.    retu
12860 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12870 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b  UNLOCK;.  }else{
12880 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
12890 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
128a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
128b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
128c0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
128d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
128e0 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  flockClose(sqlit
128f0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
12900 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66   if( id ){.    f
12910 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
12920 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72  O_LOCK);.  }.  r
12930 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
12940 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64  ile(id);.}..#end
12950 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
12960 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
12970 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20  E && !OS_VXWORK 
12980 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
12990 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
129a0 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69  the flock lock i
129b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
129c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129d0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
129e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a20 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
12a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a70 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
12a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
12a90 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68  gin Named Semaph
12aa0 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ore Locking ****
12ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ac0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64  ****.**.** Named
12ad0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
12ae0 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f  ng is only suppo
12af0 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  rted on VxWorks.
12b00 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
12b10 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
12b20 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c   dot-lock and fl
12b30 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72  ock in that it r
12b40 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75  eally only.** su
12b50 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45  pports EXCLUSIVE
12b60 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20   locking.  Only 
12b70 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
12b80 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69   can read or wri
12b90 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  te.** the databa
12ba0 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d  se file at a tim
12bb0 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  e.  This reduces
12bc0 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75   potential concu
12bd0 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d  rrency, but.** m
12be0 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d  akes the lock im
12bf0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63  plementation muc
12c00 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66  h easier..*/.#if
12c10 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a   OS_VXWORKS../*.
12c20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12c30 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
12c40 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
12c50 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
12c60 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
12c70 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
12c80 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
12c90 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
12ca0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
12cb0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
12cc0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
12cd0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
12ce0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
12cf0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
12d00 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
12d10 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
12d20 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
12d30 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
12d40 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
12d50 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65  c int semCheckRe
12d60 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
12d70 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12d80 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
12d90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12da0 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
12db0 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
12dc0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
12dd0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
12de0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
12df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12e00 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
12e10 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
12e20 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
12e30 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
12e40 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
12e50 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
12e60 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
12e70 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12e80 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
12e90 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
12ea0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
12eb0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
12ec0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
12ed0 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
12ee0 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
12ef0 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53  ){.    sem_t *pS
12f00 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
12f10 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74  de->pSem;.    st
12f20 72 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75  ruct stat statBu
12f30 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f  f;..    if( sem_
12f40 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
12f50 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  1 ){.      int t
12f60 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12f70 20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20       if( EAGAIN 
12f80 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
12f90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12fa0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
12fb0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
12fc0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
12fd0 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
12fe0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
12ff0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
13000 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
13010 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e         /* someon
13020 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c  e else has the l
13030 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20  ock when we are 
13040 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  in NO_LOCK */.  
13050 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
13060 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
13070 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck < SHARED_LOCK
13080 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13090 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77  else{.      /* w
130a0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20  e could have it 
130b0 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f  if we want it */
130c0 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28  .      sem_post(
130d0 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSem);.    }.  }
130e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
130f0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
13100 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
13110 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
13120 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
13130 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
13140 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13150 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
13160 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
13170 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
13180 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
13190 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
131a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
131b0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
131c0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
131d0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
131e0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
131f0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
13200 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
13210 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
13220 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
13230 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
13240 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
13250 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
13260 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
13270 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
13280 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
13290 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
132a0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
132b0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
132c0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
132d0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
132e0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
132f0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
13300 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
13310 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
13320 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
13330 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
13340 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
13350 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
13360 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
13370 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
13380 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
13390 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
133a0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
133b0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
133c0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
133d0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
133e0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
133f0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
13400 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  E.**.** Semaphor
13410 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61  e locks only rea
13420 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
13430 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
13440 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
13450 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
13460 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
13470 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
13480 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
13490 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
134a0 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
134b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
134c0 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
134d0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
134e0 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
134f0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
13500 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
13510 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
13520 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
13530 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
13540 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
13550 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
13560 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
13570 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74  nt semLock(sqlit
13580 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
13590 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
135a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
135b0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
135c0 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d  .  int fd;.  sem
135d0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
135e0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
135f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13600 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  E_OK;..  /* if w
13610 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
13620 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
13630 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
13640 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
13650 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
13660 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
13670 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
13680 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
13690 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
136a0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
136b0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
136c0 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73  E_OK;.    goto s
136d0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
136e0 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65  .  .  /* lock se
136f0 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20  maphore now but 
13700 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c  bail out when al
13710 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f  ready locked. */
13720 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61  .  if( sem_trywa
13730 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
13740 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13750 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73  BUSY;.    goto s
13760 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
13770 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73  ..  /* got it, s
13780 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
13790 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
137a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
137b0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73  = eFileLock;.. s
137c0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72  em_end_lock:.  r
137d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
137e0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
137f0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
13800 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
13810 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
13820 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
13830 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
13840 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
13850 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
13860 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
13870 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
13880 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
13890 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
138a0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
138b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
138c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
138d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
138e0 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b  ic int semUnlock
138f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13900 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
13910 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
13920 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13930 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  e*)id;.  sem_t *
13940 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
13950 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61  node->pSem;..  a
13960 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
13970 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29    assert( pSem )
13980 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
13990 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
139a0 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c  %d pid=%d (sem)\
139b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
139c0 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69  ileLock,..   pFi
139d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
139e0 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
139f0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
13a00 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13a10 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
13a20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
13a30 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13a40 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
13a50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13a60 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
13a70 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
13a80 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
13a90 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
13aa0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
13ab0 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
13ac0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
13ad0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13ae0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
13af0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
13b00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13b10 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20    /* no, really 
13b20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20  unlock. */.  if 
13b30 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29  ( sem_post(pSem)
13b40 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
13b50 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72   rc, tErrno = er
13b60 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rno;.    rc = sq
13b70 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13b80 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13b90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
13ba0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
13bb0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
13bc0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
13bd0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
13be0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
13bf0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
13c00 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13c10 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
13c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13c30 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
13c40 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
13c50 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28  ic int semClose(
13c60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13c70 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
13c80 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
13c90 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13ca0 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f  )id;.    semUnlo
13cb0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
13cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
13cd0 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  le );.    unixEn
13ce0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
13cf0 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
13d00 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69  (pFile);.    uni
13d10 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
13d20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65     closeUnixFile
13d30 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
13d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13d50 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
13d60 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e  WORKS */./*.** N
13d70 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
13d80 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
13d90 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f  vailable on VxWo
13da0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  rks..**.********
13db0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
13dc0 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
13dd0 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  re lock implemen
13de0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
13df0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
13e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e40 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
13e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13eb0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20  ***** Begin AFP 
13ec0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
13ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
13ef0 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65  AFP is the Apple
13f00 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c   Filing Protocol
13f10 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77  .  AFP is a netw
13f20 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66  ork filesystem f
13f30 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65  ound.** on Apple
13f40 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75   Macintosh compu
13f50 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20  ters - both OS9 
13f60 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54  and OSX..**.** T
13f70 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65  hird-party imple
13f80 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46  mentations of AF
13f90 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  P are available.
13fa0 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20    But this code 
13fb0 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72  here.** only wor
13fc0 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23  ks on OSX..*/..#
13fd0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
13fe0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
13ff0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
14000 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  TYLE./*.** The a
14010 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14020 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
14030 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b  ins all afp lock
14040 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
14050 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
14060 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
14070 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ext afpLockingCo
14080 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66  ntext;.struct af
14090 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
140a0 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  {.  int reserved
140b0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
140c0 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
140d0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
140e0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  he open file */.
140f0 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
14100 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
14110 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
14120 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
14130 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
14140 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
14150 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
14160 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
14170 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
14180 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
14190 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
141a0 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
141b0 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
141c0 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
141d0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
141e0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
141f0 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
14200 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
14210 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
14220 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
14230 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
14240 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
14250 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
14260 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
14270 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
142a0 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
142b0 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
142c0 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
142d0 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
142e0 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
142f0 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
14300 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
14310 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
14320 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65  a utility for se
14330 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e  tting or clearin
14340 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f  g a bit-range lo
14350 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20  ck on an.** AFP 
14360 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a  filesystem..** .
14370 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
14380 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  _OK on success, 
14390 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66  SQLITE_BUSY on f
143a0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
143b0 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b  c int afpSetLock
143c0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
143d0 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  path,           
143e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
143f0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  e file to be loc
14400 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20  ked or unlocked 
14410 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
14420 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
14430 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
14440 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70   descriptor on p
14450 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ath */.  unsigne
14460 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
14470 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  et,     /* First
14480 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
14490 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
144a0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
144b0 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  h,     /* Number
144c0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
144d0 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f  k */.  int setLo
144e0 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  ckFlag          
144f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
14500 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73   set lock.  Fals
14510 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20  e to clear lock 
14520 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42  */.){.  struct B
14530 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20  yteRangeLockPB2 
14540 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20  pb;.  int err;. 
14550 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
14560 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
14570 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
14580 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
14590 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
145a0 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
145b0 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
145c0 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  b.fd = pFile->h;
145d0 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22  .  .  OSTRACE(("
145e0 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20  AFPSETLOCK [%s] 
145f0 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67  for %d%s in rang
14600 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20  e %llx:%llx\n", 
14610 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61  .    (setLockFla
14620 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70  g?"ON":"OFF"), p
14630 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d  File->h, (pb.fd=
14640 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d  =-1?"[testval-1]
14650 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65  ":""),.    offse
14660 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65  t, length));.  e
14670 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c  rr = fsctl(path,
14680 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
14690 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20  ock2FSCTL, &pb, 
146a0 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d  0);.  if ( err==
146b0 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
146c0 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  c;.    int tErrn
146d0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f  o = errno;.    O
146e0 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
146f0 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73  OCK failed to fs
14700 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73  ctl() '%s' %d %s
14710 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
14720 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20    path, tErrno, 
14730 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29  strerror(tErrno)
14740 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
14750 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
14760 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20  K_ERRORS.    rc 
14770 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23  = SQLITE_BUSY;.#
14780 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71  else.    rc = sq
14790 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
147a0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a  ixError(tErrno,.
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147c0 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20      setLockFlag 
147d0 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  ? SQLITE_IOERR_L
147e0 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  OCK : SQLITE_IOE
147f0 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64  RR_UNLOCK);.#end
14800 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
14810 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
14820 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ORS */.    if( I
14830 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
14840 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
14850 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
14860 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
14870 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
14880 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
14890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
148a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
148b0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
148c0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
148d0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
148e0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
148f0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
14900 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
14910 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
14920 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
14930 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
14940 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
14950 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
14960 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
14970 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
14980 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
14990 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
149a0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
149b0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
149c0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
149d0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68  static int afpCh
149e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
149f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14a00 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
14a10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14a20 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
14a30 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
14a40 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14a50 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
14a60 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14a70 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  t *context;.  . 
14a80 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14a90 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
14aa0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
14ab0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
14ac0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
14ad0 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61  ;.  context = (a
14ae0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14af0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
14b00 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28  ngContext;.  if(
14b10 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
14b20 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f  ed ){.    *pResO
14b30 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ut = 1;.    retu
14b40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14b50 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
14b60 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
14b70 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
14b80 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
14b90 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20  threads */.  .  
14ba0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
14bb0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
14bc0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
14bd0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
14be0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
14bf0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
14c00 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
14c10 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
14c20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
14c30 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
14c40 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
14c50 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  it..   */.  if( 
14c60 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
14c70 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53   /* lock the RES
14c80 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20  ERVED byte */.  
14c90 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53    int lrc = afpS
14ca0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
14cb0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
14cc0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
14cd0 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51  1);  .    if( SQ
14ce0 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a  LITE_OK==lrc ){.
14cf0 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73        /* if we s
14d00 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69  ucceeded in taki
14d10 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20  ng the reserved 
14d20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
14d30 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20  to restore.     
14d40 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
14d50 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20   state */.      
14d60 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
14d70 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
14d80 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
14d90 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
14da0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
14db0 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65    /* if we faile
14dc0 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  d to get the loc
14dd0 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65  k then someone e
14de0 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74  lse must have it
14df0 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76   */.      reserv
14e00 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
14e10 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
14e20 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
14e30 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a    rc=lrc;.    }.
14e40 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
14e50 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
14e60 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
14e70 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66  OCK %d %d %d (af
14e80 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
14e90 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
14ea0 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  .  .  *pResOut =
14eb0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
14ec0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14ed0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
14ee0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
14ef0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
14f00 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
14f10 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
14f20 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
14f30 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
14f40 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
14f50 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
14f60 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
14f70 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
14f80 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
14f90 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
14fa0 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
14fb0 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
14fc0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
14fd0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
14fe0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
14ff0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
15000 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
15010 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
15020 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
15030 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
15040 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
15050 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
15060 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
15070 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
15080 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
15090 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
150a0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
150b0 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
150c0 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
150d0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
150e0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
150f0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
15100 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
15110 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
15120 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
15130 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
15140 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
15150 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
15160 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
15170 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
15180 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15190 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
151a0 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
151b0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
151c0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
151d0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
151e0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
151f0 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63  tatic int afpLoc
15200 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15210 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
15220 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
15230 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
15240 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
15250 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
15260 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
15270 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
15280 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
15290 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
152a0 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
152b0 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
152c0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
152d0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
152e0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
152f0 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
15300 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
15310 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
15320 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
15330 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
15340 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
15350 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
15360 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
15370 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
15380 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
15390 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ck), pInode->nSh
153a0 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
153b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
153c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
153d0 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
153e0 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
153f0 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
15400 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
15410 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
15420 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63   the afp_end_loc
15430 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
15440 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
15450 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
15460 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
15470 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
15480 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
15490 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
154a0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
154b0 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
154c0 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c   held) (afp)\n",
154d0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
154e0 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
154f0 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
15500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15510 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
15520 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
15530 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
15540 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28   correct.  **  (
15550 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
15560 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
15570 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
15580 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
15590 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
155a0 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
155b0 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
155c0 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
155d0 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
155e0 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
155f0 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
15600 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
15610 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
15620 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
15630 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
15640 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
15650 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
15660 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
15670 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
15680 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
15690 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
156a0 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
156b0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
156c0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
156d0 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
156e0 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
156f0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
15700 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
15710 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
15720 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
15730 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
15740 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
15750 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
15760 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
15770 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
15780 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
15790 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
157a0 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
157b0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
157c0 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
157d0 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
157e0 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
157f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
15800 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
15810 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
15820 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
15830 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
15840 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
15850 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
15860 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
15870 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
15880 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
15890 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
158a0 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
158b0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
158c0 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
158d0 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
158e0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
158f0 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
15900 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
15910 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
15920 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
15930 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
15940 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
15950 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
15960 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
15970 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
15980 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
15990 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
159a0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
159b0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
159c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
159d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
159e0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
159f0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
15a00 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
15a10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
15a20 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
15a30 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
15a40 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
15a50 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
15a60 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
15a70 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
15a80 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
15a90 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
15aa0 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
15ab0 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
15ac0 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
15ad0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
15ae0 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
15af0 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
15b00 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
15b10 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
15b20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
15b30 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
15b40 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
15b50 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
15b60 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
15b70 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
15b80 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
15b90 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
15ba0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
15bb0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
15bc0 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
15bd0 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
15be0 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
15bf0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
15c00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15c10 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15c20 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
15c30 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
15c40 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
15c50 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
15c60 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
15c70 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
15c80 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
15c90 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
15ca0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
15cb0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15cc0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
15cd0 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
15ce0 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67  no = 0;.    long
15cf0 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
15d00 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
15d10 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
15d20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
15d30 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
15d40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
15d50 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
15d60 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
15d70 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
15d80 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
15d90 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
15da0 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
15db0 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
15dc0 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
15dd0 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
15de0 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
15df0 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
15e00 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
15e10 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
15e20 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
15e30 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
15e40 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
15e50 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
15e60 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15e70 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
15e80 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
15e90 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
15ea0 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
15eb0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
15ec0 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
15ed0 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
15ee0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
15ef0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
15f00 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
15f10 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
15f20 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
15f30 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15f40 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
15f50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
15f60 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
15f70 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
15f80 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70  rc1) ) {.      p
15f90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15fa0 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20  = lrc1Errno;.   
15fb0 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
15fc0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
15fd0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
15fe0 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52  e if( IS_LOCK_ER
15ff0 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20  ROR(lrc2) ){.   
16000 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20     rc = lrc2;.  
16010 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
16020 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
16030 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51  e if( lrc1 != SQ
16040 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
16050 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
16060 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
16070 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16080 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
16090 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
160a0 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
160b0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
160c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
160d0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
160e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
160f0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16100 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
16110 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
16120 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
16130 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
16140 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
16150 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
16160 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
16170 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
16180 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
16190 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
161a0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
161b0 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
161c0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
161d0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
161e0 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
161f0 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
16200 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
16210 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
16220 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
16230 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
16240 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a  int failed = 0;.
16250 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
16260 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16270 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65  );.    if (eFile
16280 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44  Lock >= RESERVED
16290 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
162a0 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45  eFileLock < RESE
162b0 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
162c0 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
162d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
162e0 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
162f0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
16300 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16310 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
16320 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20  BYTE, 1,1);.    
16330 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b    if( !failed ){
16340 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
16350 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a  ->reserved = 1;.
16360 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16370 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
16380 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58   eFileLock == EX
16390 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
163a0 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
163b0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
163c0 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20  ck */.        . 
163d0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
163e0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62  he shared lock b
163f0 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65  efore trying the
16400 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e   range.  we'll n
16410 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  eed to .      **
16420 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
16430 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
16440 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65  we can't get the
16450 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20    afpUnlock.    
16460 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
16470 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74  (failed = afpSet
16480 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16490 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
164a0 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164c0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61       pInode->sha
164d0 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20  redByte, 1, 0)) 
164e0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
164f0 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f  ailed2 = SQLITE_
16500 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e  OK;.        /* n
16510 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67  ow attemmpt to g
16520 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
16530 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
16540 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
16550 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16560 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16570 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
16580 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
165b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61  ;.        if( fa
165c0 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32  iled && (failed2
165d0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
165e0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
165f0 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
16610 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e  ARED_FIRST + pIn
16620 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
16630 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20   1, 1)) ){.     
16640 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65       /* Can't re
16650 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
16660 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69  ared lock.  Sqli
16670 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74  te can't deal, t
16680 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20  his is.         
16690 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49   ** a critical I
166a0 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  /O error.       
166b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
166c0 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20  rc = ((failed & 
166d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
166e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f   SQLITE_IOERR) ?
166f0 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20   failed2 : .    
16700 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
16710 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
16720 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70          goto afp
16730 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20  _end_lock;.     
16740 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73     } .      }els
16750 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
16760 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d  failed; .      }
16770 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
16780 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
16790 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
167a0 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  }.  }.  .  if( r
167b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
167c0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
167d0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
167e0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
167f0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
16800 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
16810 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
16820 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
16830 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16840 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
16850 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
16860 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
16870 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a  NG_LOCK;.  }.  .
16880 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  afp_end_lock:.  
16890 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
168a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
168b0 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
168c0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
168d0 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
168e0 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
168f0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
16900 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
16910 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
16920 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
16930 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
16940 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
16950 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
16960 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
16970 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
16980 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
16990 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
169a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
169b0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
169c0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
169d0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
169e0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
169f0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
16a00 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
16a10 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
16a20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
16a30 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   afpUnlock(sqlit
16a40 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16a50 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
16a60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16a70 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
16a80 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16a90 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
16aa0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
16ab0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
16ac0 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
16ad0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16ae0 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
16af0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
16b00 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30  t skipShared = 0
16b10 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16b20 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70  TEST.  int h = p
16b30 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a  File->h;.#endif.
16b40 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16b50 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16b60 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
16b70 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
16b80 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
16b90 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
16ba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
16bb0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
16bc0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
16bd0 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
16be0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
16bf0 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70  .           getp
16c00 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  id()));..  asser
16c10 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
16c20 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
16c30 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
16c40 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
16c50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16c60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
16c70 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
16c80 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
16c90 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
16ca0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
16cb0 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
16cc0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16cd0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
16ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
16cf0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
16d00 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16d10 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
16d20 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
16d30 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
16d40 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
16d50 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
16d60 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
16d70 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47   .#ifndef NDEBUG
16d80 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
16d90 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
16da0 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
16db0 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
16dc0 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
16dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16de0 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
16df0 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
16e00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
16e10 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
16e20 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
16e30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
16e40 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
16e50 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
16e60 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
16e70 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
16e80 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
16e90 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
16ea0 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
16eb0 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
16ec0 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
16ed0 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
16ee0 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
16ef0 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
16f00 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
16f10 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
16f20 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
16f30 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
16f40 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
16f50 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
16f60 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
16f70 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
16f80 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
16f90 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
16fa0 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
16fb0 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
16fc0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
16fd0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
16fe0 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
16ff0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
17000 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
17010 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
17020 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17030 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17040 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17050 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  RST, SHARED_SIZE
17060 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
17070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17080 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
17090 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
170a0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29  de->nShared>1) )
170b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c  {.        /* onl
170c0 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  y re-establish t
170d0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
170e0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
170f0 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65         int share
17100 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
17110 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17120 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
17130 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
17140 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17150 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
17160 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
17170 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
17180 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53   {.        skipS
17190 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  hared = 1;.     
171a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
171b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
171c0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
171d0 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
171e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
171f0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17200 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17210 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
17220 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20  1, 0);.    } .  
17230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17240 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
17250 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ileLock>=RESERVE
17260 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78  D_LOCK && contex
17270 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
17280 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
17290 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
172a0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
172b0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
172c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63  );.      if( !rc
172d0 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e   ){ .        con
172e0 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
172f0 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20   0; .      }.   
17300 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
17310 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
17320 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
17330 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
17340 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20  Shared>1)){.    
17350 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
17360 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
17370 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
17380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17390 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e   && eFileLock==N
173a0 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f  O_LOCK ){..    /
173b0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
173c0 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
173d0 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
173e0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
173f0 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
17400 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
17410 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
17420 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
17430 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
17440 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
17450 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
17460 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63  g long sharedLoc
17470 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
17480 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
17490 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e  redByte;.    pIn
174a0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
174b0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
174c0 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
174d0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
174e0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
174f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17500 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
17510 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17520 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
17530 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61      if( !skipSha
17540 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
17550 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17560 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17570 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
17580 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  kByte, 1, 0);.  
17590 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
175a0 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !rc ){.        p
175b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
175c0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
175d0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
175e0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
175f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17600 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17610 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  _OK ){.      pIn
17620 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
17630 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
17640 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
17650 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
17660 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
17670 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
17680 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
17690 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
176a0 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
176b0 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
176c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
176d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
176e0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
176f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17700 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
17710 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
17720 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
17730 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
17740 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
17750 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
17760 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17770 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
17780 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
17790 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
177a0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55  le*)id;.    afpU
177b0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
177c0 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  K);.    unixEnte
177d0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
177e0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  ( pFile->pInode 
177f0 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
17800 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->nLock ){.     
17810 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
17820 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
17830 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
17840 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
17850 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a  le just.      **
17860 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
17870 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
17880 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
17890 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
178a0 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
178b0 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
178c0 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
178d0 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
178e0 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
178f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
17900 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
17910 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
17920 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
17930 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
17940 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
17950 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73  fo(pFile);.    s
17960 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
17970 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
17980 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f  t);.    rc = clo
17990 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
179a0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
179b0 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ex();.  }.  retu
179c0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
179d0 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
179e0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
179f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
17a00 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
17a10 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
17a20 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
17a30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
17a40 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
17a50 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
17a60 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
17a70 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
17a80 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
17a90 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
17aa0 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  s available.  If
17ab0 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69   you don't compi
17ac0 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68  le for a mac, th
17ad0 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70  en the "unix-afp
17ae0 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20  ".** VFS is not 
17af0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
17b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b10 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41  *** End of the A
17b20 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
17b30 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
17b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
17b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
17ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
17bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
17c10 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   NFS Locking ***
17c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
17c40 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
17c50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
17c60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
17c70 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77  STYLE./*. ** Low
17c80 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
17c90 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
17ca0 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
17cb0 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
17cc0 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20  leLock. ** must 
17cd0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
17ce0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
17cf0 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65  .. **. ** If the
17d00 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
17d10 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
17d20 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
17d30 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a   at or below. **
17d40 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
17d50 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
17d60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17d70 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69  no-op.. */.stati
17d80 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28  c int nfsUnlock(
17d90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17da0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
17db0 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
17dc0 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
17dd0 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e  Lock, 1);.}..#en
17de0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
17df0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
17e00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
17e10 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
17e20 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
17e30 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   is the NFS lock
17e40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
17e50 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
17e60 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
17e70 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
17e80 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
17e90 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
17ea0 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
17eb0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
17ec0 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   .**.***********
17ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
17ee0 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  f the NFS lock i
17ef0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
17f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f10 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
17f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f60 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
17f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17fb0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
17fc0 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69  ****** Non-locki
17fd0 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ng sqlite3_file 
17fe0 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
17ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18000 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
18010 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f  next division co
18020 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74  ntains implement
18030 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d  ations for all m
18040 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a  ethods of the .*
18050 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  * sqlite3_file o
18060 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e  bject other than
18070 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   the locking met
18080 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69  hods.  The locki
18090 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65  ng.** methods we
180a0 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69  re defined in di
180b0 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f  visions above (o
180c0 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ne locking metho
180d0 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f  d per.** divisio
180e0 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f  n).  Those metho
180f0 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  ds that are comm
18100 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
18110 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67  g modes.** are g
18120 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69  ather together i
18130 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f  nto this divisio
18140 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  n..*/../*.** See
18150 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
18160 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
18170 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74  cond argument, t
18180 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a  hen read cnt .**
18190 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
181a0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
181b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
181c0 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ually read..**.*
181d0 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65  * NB:  If you de
181e0 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f  fine USE_PREAD o
181f0 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74  r USE_PREAD64, t
18200 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73  hen it might als
18210 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  o.** be necessar
18220 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  y to define _XOP
18230 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20  EN_SOURCE to be 
18240 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65  500.  This varie
18250 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79  s from.** one sy
18260 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e  stem to another.
18270 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64    Since SQLite d
18280 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55  oes not define U
18290 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20  SE_PREAD.** any 
182a0 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
182b0 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
182c0 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
182d0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
182e0 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
182f0 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
18300 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
18310 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
18320 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
18330 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
18340 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
18350 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
18360 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
18370 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
18380 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
18390 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
183a0 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
183b0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
183c0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20   int got;.  int 
183d0 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28  prior = 0;.#if (
183e0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
183f0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
18400 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
18410 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
18420 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
18430 41 52 54 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64  ART;.  do{.#if d
18440 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
18450 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72  ).    got = osPr
18460 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
18470 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
18480 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18490 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
184a0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
184b0 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20 67  E_PREAD64).    g
184c0 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69  ot = osPread64(i
184d0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
184e0 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
184f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
18500 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
18510 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  .    newOffset =
18520 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
18530 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
18540 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18550 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
18560 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  - );.    if( new
18570 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
18580 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f  {.      if( newO
18590 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20  ffset == -1 ){. 
185a0 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c         ((unixFil
185b0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
185c0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
185d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
185e0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
185f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
18600 09 09 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ...      }.     
18610 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
18620 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65  }.    got = osRe
18630 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
18640 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  cnt);.#endif.   
18650 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20   if( got==cnt ) 
18660 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67  break;.    if( g
18670 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ot<0 ){.      if
18680 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  ( errno==EINTR )
18690 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69  { got = 1; conti
186a0 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69  nue; }.      pri
186b0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 28  or = 0;.      ((
186c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
186d0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
186e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
186f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74     }else if( got
18700 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20  >0 ){.      cnt 
18710 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66  -= got;.      of
18720 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20  fset += got;.   
18730 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b     prior += got;
18740 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76  .      pBuf = (v
18750 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61  oid*)(got + (cha
18760 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a  r*)pBuf);.    }.
18770 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20    }while( got>0 
18780 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  );.  TIMER_END;.
18790 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
187a0 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c      %-3d %5d %7l
187b0 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20  ld %llu\n",.    
187c0 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67          id->h, g
187d0 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74  ot+prior, offset
187e0 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c  -prior, TIMER_EL
187f0 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
18800 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a  n got+prior;.}..
18810 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
18820 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f  from a file into
18830 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75   a buffer.  Retu
18840 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
18850 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72  all.** bytes wer
18860 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  e read successfu
18870 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  lly and SQLITE_I
18880 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67  OERR if anything
18890 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a   goes.** wrong..
188a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
188b0 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  ixRead(.  sqlite
188c0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76  3_file *id, .  v
188d0 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
188e0 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
188f0 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b  _int64 offset.){
18900 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
18910 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
18920 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  )id;.  int got;.
18930 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
18940 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
18950 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
18960 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
18970 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
18980 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
18990 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
189a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
189b0 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
189c0 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
189d0 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
189e0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
189f0 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
18a00 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
18a10 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
18a20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
18a30 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
18a40 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67    );.#endif..  g
18a50 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
18a60 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
18a70 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
18a80 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
18a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18aa0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
18ab0 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
18ac0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
18ad0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
18ae0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18af0 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
18b00 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
18b10 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
18b20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
18b30 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a   error */.    /*
18b40 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
18b50 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
18b60 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
18b70 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
18b80 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74  (char*)pBuf)[got
18b90 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a  ], 0, amt-got);.
18ba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18bb0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
18bc0 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  AD;.  }.}../*.**
18bd0 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
18be0 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65  set in id->offse
18bf0 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  t then read cnt 
18c00 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
18c10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
18c20 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
18c30 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55  ctually read.  U
18c40 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74  pdate the offset
18c50 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
18c60 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
18c70 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
18c80 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20  ailed write the 
18c90 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
18ca0 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
18cb0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
18cc0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
18cd0 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20  dWrite(unixFile 
18ce0 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *id, i64 offset,
18cf0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
18d00 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
18d10 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65  nt got;.#if (!de
18d20 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
18d30 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
18d40 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
18d50 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
18d60 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
18d70 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
18d80 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 67  E_PREAD).  do{ g
18d90 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 28 69 64  ot = osPwrite(id
18da0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
18db0 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28  offset); }while(
18dc0 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
18dd0 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20  =EINTR );.#elif 
18de0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
18df0 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  D64).  do{ got =
18e00 20 6f 73 50 77 72 69 74 65 36 34 28 69 64 2d 3e   osPwrite64(id->
18e10 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
18e20 66 73 65 74 29 3b 7d 77 68 69 6c 65 28 20 67 6f  fset);}while( go
18e30 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
18e40 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f  NTR);.#else.  do
18e50 7b 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20  {.    newOffset 
18e60 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
18e70 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
18e80 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
18e90 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74  Error( newOffset
18ea0 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  -- );.    if( ne
18eb0 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
18ec0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  ){.      if( new
18ed0 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a  Offset == -1 ){.
18ee0 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69          ((unixFi
18ef0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
18f00 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
18f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18f20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
18f30 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
18f40 09 09 09 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ....      }.    
18f50 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
18f60 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 57   }.    got = osW
18f70 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
18f80 2c 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69 6c 65  , cnt);.  }while
18f90 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
18fa0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
18fb0 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
18fc0 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
18fd0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18fe0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
18ff0 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rrno;.  }..  OST
19000 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25  RACE(("WRITE   %
19010 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
19020 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f  lu\n", id->h, go
19030 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52  t, offset, TIMER
19040 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65  _ELAPSED));.  re
19050 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
19060 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
19070 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
19080 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
19090 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
190a0 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
190b0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
190c0 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
190d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
190e0 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
190f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
19100 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
19110 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
19120 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
19130 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
19140 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
19150 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
19160 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
19170 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
19180 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
19190 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
191a0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
191b0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
191c0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
191d0 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
191e0 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
191f0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
19200 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
19210 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
19220 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
19230 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
19240 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
19250 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
19260 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
19270 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
19280 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
19290 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   );.#endif..#ifn
192a0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
192b0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
192c0 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
192d0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
192e0 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
192f0 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f  .  ** doing a ho
19300 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
19310 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
19320 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
19330 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72   than a.  ** nor
19340 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
19350 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74  e) then record t
19360 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
19370 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68   database.  ** h
19380 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  as changed.  If 
19390 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
193a0 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66  counter is modif
193b0 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74  ied, record that
193c0 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a  .  ** fact too..
193d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
193e0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
193f0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  ){.    pFile->db
19400 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20  Update = 1;  /* 
19410 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  The database has
19420 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a   been modified *
19430 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  /.    if( offset
19440 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61  <=24 && offset+a
19450 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20  mt>=27 ){.      
19460 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68  int rc;.      ch
19470 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20  ar oldCntr[4];. 
19480 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19490 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
194a0 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e       rc = seekAn
194b0 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c  dRead(pFile, 24,
194c0 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20   oldCntr, 4);.  
194d0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
194e0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
194f0 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c      if( rc!=4 ||
19500 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c   memcmp(oldCntr,
19510 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
19520 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d  24-offset], 4)!=
19530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
19540 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
19550 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74  g = 1;  /* The t
19560 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
19570 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a  er has changed *
19580 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
19590 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68    }.#endif..  wh
195a0 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77  ile( amt>0 && (w
195b0 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rote = seekAndWr
195c0 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ite(pFile, offse
195d0 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30  t, pBuf, amt))>0
195e0 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
195f0 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
19600 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
19610 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
19620 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
19630 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
19640 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
19650 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
19660 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
19670 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
19680 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61  t=1 ));..  if( a
19690 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  mt>0 ){.    if( 
196a0 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65  wrote<0 && pFile
196b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f  ->lastErrno!=ENO
196c0 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  SPC ){.      /* 
196d0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
196e0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
196f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19700 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
19710 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19720 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
19730 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
19740 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
19750 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
19760 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
19770 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
19780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
19790 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
197a0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
197b0 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
197c0 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
197d0 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
197e0 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
197f0 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
19800 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
19810 75 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  urring at the ri
19820 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
19830 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
19840 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
19850 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
19860 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
19870 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f  ../*.** We do no
19880 74 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20  t trust systems 
19890 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72  to provide a wor
198a0 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29  king fdatasync()
198b0 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f  .  Some do..** O
198c0 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f  thers do no.  To
198d0 20 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c   be safe, we wil
198e0 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65  l stick with the
198f0 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65   (slightly slowe
19900 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49  r).** fsync(). I
19910 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20  f you know that 
19920 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73  your system does
19930 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79   support fdatasy
19940 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a  nc() correctly,.
19950 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63  ** then simply c
19960 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64  ompile with -Dfd
19970 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e  atasync=fdatasyn
19980 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  c.*/.#if !define
19990 64 28 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64  d(fdatasync).# d
199a0 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
199b0 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a  fsync.#endif../*
199c0 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f  .** Define HAVE_
199d0 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f  FULLFSYNC to 0 o
199e0 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 1 depending on
199f0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
19a00 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** the F_FULLFSY
19a10 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
19a20 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e  ned.  F_FULLFSYN
19a30 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  C is currently.*
19a40 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  * only available
19a50 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42   on Mac OS X.  B
19a60 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68  ut that could ch
19a70 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ange..*/.#ifdef 
19a80 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65  F_FULLFSYNC.# de
19a90 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
19aa0 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65  YNC 1.#else.# de
19ab0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
19ac0 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  YNC 0.#endif.../
19ad0 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29  *.** The fsync()
19ae0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65   system call doe
19af0 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64  s not work as ad
19b00 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79  vertised on many
19b10 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73  .** unix systems
19b20 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
19b30 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e   procedure is an
19b40 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65   attempt to make
19b50 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74  .** it work bett
19b60 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  er..**.** The SQ
19b70 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63  LITE_NO_SYNC mac
19b80 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20  ro disables all 
19b90 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20  fsync()s.  This 
19ba0 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  is useful.** for
19bb0 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65   testing when we
19bc0 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72   want to run thr
19bd0 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75  ough the test su
19be0 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20  ite quickly..** 
19bf0 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79  You are strongly
19c00 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74   advised *not* t
19c10 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51  o deploy with SQ
19c20 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20  LITE_NO_SYNC.** 
19c30 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72  enabled, however
19c40 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c  , since with SQL
19c50 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62  ITE_NO_SYNC enab
19c60 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68  led, an OS crash
19c70 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
19c80 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  lure will likely
19c90 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
19ca0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
19cb0 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68  * SQLite sets th
19cc0 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20  e dataOnly flag 
19cd0 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  if the size of t
19ce0 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61  he file is uncha
19cf0 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65  nged..** The ide
19d00 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c  a behind dataOnl
19d10 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f  y is that it sho
19d20 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  uld only write t
19d30 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a  he file content.
19d40 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20  ** to disk, not 
19d50 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f  the inode.  We o
19d60 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79  nly set dataOnly
19d70 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a   if the file siz
19d80 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  e is .** unchang
19d90 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c  ed since the fil
19da0 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f  e size is part o
19db0 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f  f the inode.  Ho
19dc0 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54  wever, .** Ted T
19dd0 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61  s'o tells us tha
19de0 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
19df0 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  ll also write th
19e00 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a  e inode if the.*
19e10 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20  * file size has 
19e20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e  changed.  The on
19e30 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e  ly real differen
19e40 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61  ce between fdata
19e50 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73  sync().** and fs
19e60 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73  ync(), Ted tells
19e70 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61   us, is that fda
19e80 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f  tasync() will no
19e90 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69  t flush the.** i
19ea0 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d  node if the mtim
19eb0 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74  e or owner or ot
19ec0 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62  her inode attrib
19ed0 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  utes have change
19ee0 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61  d..** We only ca
19ef0 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  re about the fil
19f00 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20  e size, not the 
19f10 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69  other file attri
19f20 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20  butes, so.** as 
19f30 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73  far as SQLite is
19f40 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66   concerned, an f
19f50 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c  datasync() is al
19f60 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a  ways adequate..*
19f70 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20  * So, we always 
19f80 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20  use fdatasync() 
19f90 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  if it is availab
19fa0 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  le, regardless o
19fb0 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  f.** the value o
19fc0 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  f the dataOnly f
19fd0 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lag..*/.static i
19fe0 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e  nt full_fsync(in
19ff0 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79  t fd, int fullSy
1a000 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  nc, int dataOnly
1a010 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1a020 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1a030 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73   "ifdef/elif/els
1a040 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68  e/" block has th
1a050 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65  e same structure
1a060 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65   as.  ** the one
1a070 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65   below. It is re
1a080 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f  plicated here so
1a090 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c  lely to avoid cl
1a0a0 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75  uttering .  ** u
1a0b0 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20  p the real code 
1a0c0 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f  with the UNUSED_
1a0d0 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72  PARAMETER() macr
1a0e0 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  os..  */.#ifdef 
1a0f0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
1a100 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a110 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
1a120 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
1a130 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
1a140 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1a150 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  );.#elif HAVE_FU
1a160 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  LLFSYNC.  UNUSED
1a170 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1a180 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nly);.#else.  UN
1a190 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1a1a0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1a1b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1a1c0 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a  aOnly);.#endif..
1a1d0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
1a1e0 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
1a1f0 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72  that we do a nor
1a200 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20  mal fsync() and 
1a210 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20  .  ** FULLSYNC. 
1a220 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75   This is used du
1a230 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20  ring testing to 
1a240 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
1a250 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
1a260 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68  gets called with
1a270 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67   the correct arg
1a280 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66  uments..  */.#if
1a290 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1a2a0 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
1a2b0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1a2c0 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  c_count++;.  sql
1a2d0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
1a2e0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
1a2f0 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
1a300 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
1a310 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
1a320 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
1a330 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
1a340 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1a350 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49  SYNC.  rc = SQLI
1a360 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56  TE_OK;.#elif HAV
1a370 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
1a380 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
1a390 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66    rc = osFcntl(f
1a3a0 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  d, F_FULLFSYNC, 
1a3b0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1a3c0 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f   rc = 1;.  }.  /
1a3d0 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59  * If the FULLFSY
1a3e0 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20  NC failed, fall 
1a3f0 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69  back to attempti
1a400 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20  ng an fsync().. 
1a410 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74   ** It shouldn't
1a420 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   be possible for
1a430 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61   fullfsync to fa
1a440 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  il on the local 
1a450 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  .  ** file syste
1a460 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66  m (on OSX), so f
1a470 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73  ailure indicates
1a480 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a   that FULLFSYNC.
1a490 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f    ** isn't suppo
1a4a0 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69  rted for this fi
1a4b0 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61  le system. So, a
1a4c0 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20  ttempt an fsync 
1a4d0 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e  .  ** and (for n
1a4e0 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f  ow) ignore the o
1a4f0 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70  verhead of a sup
1a500 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63  erfluous fcntl c
1a510 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64  all.  .  ** It'd
1a520 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65   be better to de
1a530 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73  tect fullfsync s
1a540 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20  upport once and 
1a550 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20  avoid .  ** the 
1a560 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79  fcntl call every
1a570 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61   time sync is ca
1a580 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lled..  */.  if(
1a590 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
1a5a0 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66  (fd);..#elif def
1a5b0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1a5c0 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29    /* fdatasync()
1a5d0 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74   on HFS+ doesn't
1a5e0 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66   yet flush the f
1a5f0 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63  ile size if it c
1a600 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79  hanged correctly
1a610 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74  .  ** so current
1a620 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f  ly we default to
1a630 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20   the macro that 
1a640 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73  redefines fdatas
1a650 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a  ync to fsync.  *
1a660 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66  /.  rc = fsync(f
1a670 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20  d);.#else .  rc 
1a680 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b  = fdatasync(fd);
1a690 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1a6a0 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20    if( rc==-1 && 
1a6b0 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29  errno==ENOTSUP )
1a6c0 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
1a6d0 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
1a6e0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
1a6f0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  /.#endif /* ifde
1a700 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1a710 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46   elif HAVE_FULLF
1a720 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f  SYNC */..  if( O
1a730 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21  S_VXWORKS && rc!
1a740 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  = -1 ){.    rc =
1a750 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1a760 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
1a770 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
1a780 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65  ptor to the dire
1a790 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1a7a0 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e   file zFilename.
1a7b0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1a7c0 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  l, *pFd is set t
1a7d0 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
1a7e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  e descriptor and
1a7f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1a800 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1a810 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65   error occurs, e
1a820 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ither SQLITE_NOM
1a830 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  EM.** or SQLITE_
1a840 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75  CANTOPEN is retu
1a850 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73  rned and *pFd is
1a860 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66   set to an undef
1a870 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  ined.** value..*
1a880 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f  *.** The directo
1a890 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
1a8a0 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f  or is used for o
1a8b0 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20  nly one thing - 
1a8c0 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20  to.** fsync() a 
1a8d0 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b  directory to mak
1a8e0 65 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61  e sure file crea
1a8f0 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f  tion and deletio
1a900 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20  n events.** are 
1a910 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e  flushed to disk.
1a920 20 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72    Such fsyncs ar
1a930 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20  e not needed on 
1a940 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  newer.** journal
1a950 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c  ing filesystems,
1a960 20 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65   but are require
1a970 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73  d on older files
1a980 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ystems..**.** Th
1a990 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
1a9a0 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69  e overridden usi
1a9b0 6e 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61  ng the xSetSysCa
1a9c0 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ll interface..**
1a9d0 20 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   The ability to 
1a9e0 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f  override this ro
1a9f0 75 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20  utine was added 
1aa00 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68  in support of th
1aa10 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61  e.** chromium sa
1aa20 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20  ndbox.  Opening 
1aa30 61 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61  a directory is a
1aa40 20 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28   security risk (
1aa50 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20  we are.** told) 
1aa60 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65  so making it ove
1aa70 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73  rrideable allows
1aa80 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61   the chromium sa
1aa90 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c  ndbox to.** repl
1aaa0 61 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ace this routine
1aab0 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73   with a harmless
1aac0 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65   no-op.  To make
1aad0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1aae0 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63   a no-op, replac
1aaf0 65 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62  e it with a stub
1ab00 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51   that returns SQ
1ab10 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
1ab20 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74  es.** *pFd set t
1ab30 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  o a negative num
1ab40 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ber..**.** If SQ
1ab50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1ab60 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
1ab70 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1ab80 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68  or closing.** th
1ab90 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1aba0 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f  r *pFd using clo
1abb0 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se()..*/.static 
1abc0 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
1abd0 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
1abe0 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46  ilename, int *pF
1abf0 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  d){.  int ii;.  
1ac00 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63  int fd = -1;.  c
1ac10 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58  har zDirname[MAX
1ac20 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20  _PATHNAME+1];.. 
1ac30 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1ac40 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
1ac50 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20  zDirname, "%s", 
1ac60 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f  zFilename);.  fo
1ac70 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e  r(ii=(int)strlen
1ac80 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31  (zDirname); ii>1
1ac90 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d   && zDirname[ii]
1aca0 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20  !='/'; ii--);.  
1acb0 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20  if( ii>0 ){.    
1acc0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27  zDirname[ii] = '
1acd0 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  \0';.    fd = ro
1ace0 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61  bust_open(zDirna
1acf0 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
1ad00 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69  INARY, 0);.    i
1ad10 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64  f( fd>=0 ){.#ifd
1ad20 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
1ad30 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
1ad40 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c  F_SETFD, osFcntl
1ad50 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
1ad60 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
1ad70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
1ad80 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25  RACE(("OPENDIR %
1ad90 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a  -3d %s\n", fd, z
1ada0 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  Dirname));.    }
1adb0 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
1adc0 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d  ;.  return (fd>=
1add0 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78  0?SQLITE_OK:unix
1ade0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1adf0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
1ae00 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29  open", zDirname)
1ae10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
1ae20 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
1ae30 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
1ae40 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
1ae50 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
1ae60 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d  ** If dataOnly==
1ae70 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20  0 then both the 
1ae80 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20  file itself and 
1ae90 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69  its metadata (fi
1aea0 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65  le.** size, acce
1aeb0 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72  ss time, etc) ar
1aec0 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61  e synced.  If da
1aed0 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f  taOnly!=0 then o
1aee0 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nly the.** file 
1aef0 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a  data is synced..
1af00 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78  **.** Under Unix
1af10 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65  , also make sure
1af20 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74   that the direct
1af30 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1af40 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65  e file.** has be
1af50 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73  en created by fs
1af60 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65  ync-ing the dire
1af70 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
1af80 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ins the file..**
1af90 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f   If we do not do
1afa0 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63   this and we enc
1afb0 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66  ounter a power f
1afc0 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65  ailure, the dire
1afd0 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66  ctory.** entry f
1afe0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  or the journal m
1aff0 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61  ight not exist a
1b000 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20  fter we reboot. 
1b010 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c   The next.** SQL
1b020 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68  ite to access th
1b030 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20  e file will not 
1b040 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f  know that the jo
1b050 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65  urnal exists (be
1b060 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72  cause.** the dir
1b070 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1b080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1b090 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20   never created) 
1b0a0 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1b0b0 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  ion.** will not 
1b0c0 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73  roll back - poss
1b0d0 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20  ibly leading to 
1b0e0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1b0f0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1b100 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69  nt unixSync(sqli
1b110 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1b120 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
1b130 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  rc;.  unixFile *
1b140 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1b150 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73  e*)id;..  int is
1b160 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67  DataOnly = (flag
1b170 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  s&SQLITE_SYNC_DA
1b180 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  TAONLY);.  int i
1b190 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61  sFullsync = (fla
1b1a0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1b1b0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f  _SYNC_FULL;..  /
1b1c0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
1b1d0 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
1b1e0 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
1b1f0 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
1b200 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
1b210 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1b220 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
1b230 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1b240 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
1b250 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63   );..  /* Unix c
1b260 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20  annot, but some 
1b270 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75  systems may retu
1b280 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66  rn SQLITE_FULL f
1b290 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20  rom here. This. 
1b2a0 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74   ** line is to t
1b2b0 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73  est that doing s
1b2c0 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  o does not cause
1b2d0 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
1b2e0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69   */.  SimulateDi
1b2f0 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74  skfullError( ret
1b300 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
1b310 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
1b320 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
1b330 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c  (("SYNC    %-3d\
1b340 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1b350 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e    rc = full_fsyn
1b360 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75  c(pFile->h, isFu
1b370 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e  llsync, isDataOn
1b380 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ly);.  SimulateI
1b390 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
1b3a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1b3b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1b3c0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
1b3d0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1b3e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
1b3f0 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e  SYNC, "full_fsyn
1b400 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  c", pFile->zPath
1b410 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73  );.  }..  /* Als
1b420 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65  o fsync the dire
1b430 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1b440 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65   the file if the
1b450 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20   DIRSYNC flag.  
1b460 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73  ** is set.  This
1b470 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f   is a one-time o
1b480 63 63 75 72 72 61 6e 63 65 2e 20 20 4d 61 6e 79  ccurrance.  Many
1b490 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c   systems (exampl
1b4a0 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72  es: AIX).  ** ar
1b4b0 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e  e unable to fsyn
1b4c0 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73  c a directory, s
1b4d0 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20  o ignore errors 
1b4e0 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20  on the fsync..  
1b4f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1b500 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1b510 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a  FILE_DIRSYNC ){.
1b520 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20      int dirfd;. 
1b530 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52     OSTRACE(("DIR
1b540 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75  SYNC %s (have_fu
1b550 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
1b560 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
1b570 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20  e->zPath,.      
1b580 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
1b590 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
1b5a0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  ));.    rc = osO
1b5b0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69  penDirectory(pFi
1b5c0 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66  le->zPath, &dirf
1b5d0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1b5e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72  SQLITE_OK && dir
1b5f0 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  fd>=0 ){.      f
1b600 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c  ull_fsync(dirfd,
1b610 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f   0, 0);.      ro
1b620 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
1b630 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
1b640 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  _);.    }else if
1b650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
1b660 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72  TOPEN ){.      r
1b670 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b680 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1b690 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e  ctrlFlags &= ~UN
1b6a0 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a  IXFILE_DIRSYNC;.
1b6b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b6c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1b6d0 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
1b6e0 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
1b6f0 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
1b700 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
1b710 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1b720 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75   i64 nByte){.  u
1b730 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1b740 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1b750 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
1b760 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1b770 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1b780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b790 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
1b7a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
1b7b0 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
1b7c0 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
1b7d0 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
1b7e0 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
1b7f0 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
1b800 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
1b810 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
1b820 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
1b830 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
1b840 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
1b850 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
1b860 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
1b870 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
1b880 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
1b890 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1b8a0 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  nk ){.    nByte 
1b8b0 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
1b8c0 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
1b8d0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
1b8e0 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
1b8f0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f  ;.  }..  rc = ro
1b900 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1b910 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29  File->h, (off_t)
1b920 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63  nByte);.  if( rc
1b930 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
1b940 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1b950 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1b960 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1b970 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1b980 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1b990 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
1b9a0 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44  else{.#ifndef ND
1b9b0 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77  EBUG.    /* If w
1b9c0 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1b9d0 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1b9e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1b9f0 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20  s opposed to.   
1ba00 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1ba10 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1ba20 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1ba30 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1ba40 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72  han a.    ** nor
1ba50 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
1ba60 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61  e) and we trunca
1ba70 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
1ba80 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20  ero length,.    
1ba90 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76  ** that effectiv
1baa0 65 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  ely updates the 
1bab0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
1bac0 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70   This might happ
1bad0 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72  en.    ** when r
1bae0 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62  estoring a datab
1baf0 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61  ase using the ba
1bb00 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20  ckup API from a 
1bb10 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20  zero-length.    
1bb20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a  ** source..    *
1bb30 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  /.    if( pFile-
1bb40 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26  >inNormalWrite &
1bb50 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  & nByte==0 ){.  
1bb60 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
1bb70 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20  CntrChng = 1;.  
1bb80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1bb90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bba0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1bbb0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
1bbc0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
1bbd0 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
1bbe0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1bbf0 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1bc00 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  file *id, i64 *p
1bc10 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1bc20 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
1bc30 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
1bc40 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74   );.  rc = osFst
1bc50 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
1bc60 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  d)->h, &buf);.  
1bc70 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1bc80 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1bc90 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  c!=0 ){.    ((un
1bca0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1bcb0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1bcc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bcd0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1bce0 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
1bcf0 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a  f.st_size;..  /*
1bd00 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1bd10 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61  zero-size databa
1bd20 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64  se, the findInod
1bd30 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72  eInfo() procedur
1bd40 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20  e.  ** writes a 
1bd50 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f  single byte into
1bd60 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72   that file in or
1bd70 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  der to work arou
1bd80 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e  nd a bug.  ** in
1bd90 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20   the OS-X msdos 
1bda0 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20  filesystem.  In 
1bdb0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70  order to avoid p
1bdc0 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70  roblems with upp
1bdd0 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20  er.  ** layers, 
1bde0 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72  we need to repor
1bdf0 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65  t this file size
1be00 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68   as zero even th
1be10 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20  ough it is.  ** 
1be20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b  really 1.   Tick
1be30 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20  et #3260..  */. 
1be40 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29   if( *pSize==1 )
1be50 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20   *pSize = 0;... 
1be60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1be70 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
1be80 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1be90 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1bea0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
1beb0 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72  * Handler for pr
1bec0 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65  oxy-locking file
1bed0 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20  -control verbs. 
1bee0 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69   Defined below i
1bef0 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e  n the.** proxyin
1bf00 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69  g locking divisi
1bf10 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1bf20 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
1bf30 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ol(sqlite3_file*
1bf40 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e  ,int,void*);.#en
1bf50 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  dif../* .** This
1bf60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1bf70 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  led to handle th
1bf80 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1bf90 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c  IZE_HINT .** fil
1bfa0 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74  e-control operat
1bfb0 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68  ion.  Enlarge th
1bfc0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42  e database to nB
1bfd0 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20  ytes in size.** 
1bfe0 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74  (rounded up to t
1bff0 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69  he next chunk-si
1c000 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74  ze).  If the dat
1c010 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
1c020 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61  .** nBytes or la
1c030 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69  rger, this routi
1c040 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1c050 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e  /.static int fcn
1c060 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46  tlSizeHint(unixF
1c070 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20  ile *pFile, i64 
1c080 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46  nByte){.  if( pF
1c090 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1c0a0 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b  {.    i64 nSize;
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1c0d0 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1c0e0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1c0f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c100 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72  * Used to hold r
1c110 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20  eturn values of 
1c120 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20  fstat() */.   . 
1c130 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1c140 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
1c150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1c160 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20  OERR_FSTAT;..   
1c170 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65   nSize = ((nByte
1c180 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d  +pFile->szChunk-
1c190 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68  1) / pFile->szCh
1c1a0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1c1b0 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e  Chunk;.    if( n
1c1c0 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74  Size>(i64)buf.st
1c1d0 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65  _size ){..#if de
1c1e0 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
1c1f0 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
1c200 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1c210 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  ATE.      /* The
1c220 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68   code below is h
1c230 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75  andling the retu
1c240 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61  rn value of osFa
1c250 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20  llocate() .     
1c260 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70   ** correctly. p
1c270 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1c280 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22   is defined to "
1c290 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20  returns zero on 
1c2a0 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  success, .      
1c2b0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e  ** or an error n
1c2c0 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72  umber on  failur
1c2d0 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70  e". See the manp
1c2e0 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  age for details.
1c2f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72   */.      int er
1c300 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
1c310 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c       err = osFal
1c320 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  locate(pFile->h,
1c330 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53   buf.st_size, nS
1c340 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29  ize-buf.st_size)
1c350 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1c360 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  err==EINTR );.  
1c370 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65      if( err ) re
1c380 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1c390 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20  R_WRITE;.#else. 
1c3a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f       /* If the O
1c3b0 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  S does not have 
1c3c0 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1c3d0 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73  ), fake it. Firs
1c3e0 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  t use.      ** f
1c3f0 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65  truncate() to se
1c400 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1c410 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69   then write a si
1c420 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20  ngle byte to.   
1c430 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62     ** the last b
1c440 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63  yte in each bloc
1c450 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74  k within the ext
1c460 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68  ended region. Th
1c470 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  is.      ** is t
1c480 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75  he same techniqu
1c490 65 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  e used by glibc 
1c4a0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73  to implement pos
1c4b0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20  ix_fallocate(). 
1c4c0 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65       ** on syste
1c4d0 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  ms that do not h
1c4e0 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f  ave a real fallo
1c4f0 63 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61  cate() system ca
1c500 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1c510 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1c520 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1c530 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1c540 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1c550 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c570 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1c580 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20  write to */..   
1c590 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
1c5a0 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1c5b0 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  , nSize) ){.    
1c5c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1c5d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1c5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
1c5f0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1c600 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1c610 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1c620 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1c630 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74     }.      iWrit
1c640 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a  e = ((buf.st_siz
1c650 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f  e + 2*nBlk - 1)/
1c660 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20  nBlk)*nBlk-1;.  
1c670 20 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74      while( iWrit
1c680 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  e<nSize ){.     
1c690 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20     int nWrite = 
1c6a0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1c6b0 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20  le, iWrite, "", 
1c6c0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1c6d0 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
1c6e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1c6f0 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69  WRITE;.        i
1c700 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20  Write += nBlk;. 
1c710 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1c720 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1c730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c740 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
1c750 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65  s inititially ne
1c760 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73  gative then this
1c770 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65   is a query.  Se
1c780 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20  t *pArg to.** 1 
1c790 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 0 depending o
1c7a0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1c7b0 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69   bit mask of pFi
1c7c0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73  le->ctrlFlags is
1c7d0 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a   set..**.** If *
1c7e0 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20  pArg is 0 or 1, 
1c7f0 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65  then clear or se
1c800 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f  t the mask bit o
1c810 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1c820 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gs..*/.static vo
1c830 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75  id unixModeBit(u
1c840 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1c850 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61  unsigned char ma
1c860 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a  sk, int *pArg){.
1c870 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b    if( *pArg<0 ){
1c880 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46  .    *pArg = (pF
1c890 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1c8a0 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c   mask)!=0;.  }el
1c8b0 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d  se if( (*pArg)==
1c8c0 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
1c8d0 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61  ctrlFlags &= ~ma
1c8e0 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
1c8f0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1c900 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d  s |= mask;.  }.}
1c910 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
1c920 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
1c930 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
1c940 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
1c950 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
1c960 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1c970 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
1c980 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75  void *pArg){.  u
1c990 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1c9a0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1c9b0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1c9c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c9d0 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1c9e0 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1c9f0 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46  pArg = pFile->eF
1ca00 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72  ileLock;.      r
1ca10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ca20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ca30 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e  SQLITE_LAST_ERRN
1ca40 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
1ca50 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1ca60 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
1ca70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ca80 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1ca90 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
1caa0 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
1cab0 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
1cac0 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
1cad0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1cae0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1caf0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1cb00 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
1cb10 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
1cb20 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1cb30 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1cb40 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74  .      rc = fcnt
1cb50 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c  lSizeHint(pFile,
1cb60 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a   *(i64 *)pArg);.
1cb70 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1cb80 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1cb90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1cba0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1cbb0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
1cbc0 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
1cbd0 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
1cbe0 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45  ile, UNIXFILE_PE
1cbf0 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
1cc00 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
1cc10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cc20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1cc30 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
1cc40 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
1cc50 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
1cc60 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
1cc70 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
1cc80 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
1cc90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cca0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1ccb0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
1ccc0 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
1ccd0 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
1cce0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1ccf0 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  ", pFile->pVfs->
1cd00 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
1cd10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cd20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
1cd30 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20  EBUG.    /* The 
1cd40 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73  pager calls this
1cd50 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61   method to signa
1cd60 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f  l that it has do
1cd70 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c  ne.    ** a roll
1cd80 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1cd90 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  e database is th
1cda0 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65  erefore unchange
1cdb0 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20  d and.    ** it 
1cdc0 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66  hence it is OK f
1cdd0 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  or the transacti
1cde0 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  on change counte
1cdf0 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75  r to be.    ** u
1ce00 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f  nchanged..    */
1ce10 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ce20 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1ce30 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75  GED: {.      ((u
1ce40 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62  nixFile*)id)->db
1ce50 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
1ce60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ce70 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
1ce80 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1ce90 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1cea0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1ceb0 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
1cec0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
1ced0 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61  ROXYFILE:.    ca
1cee0 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  se SQLITE_GET_LO
1cef0 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
1cf00 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78       return prox
1cf10 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c  yFileControl(id,
1cf20 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a  op,pArg);.    }.
1cf30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1cf40 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1cf50 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1cf60 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20  (__APPLE__) */. 
1cf70 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1cf80 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45  CNTL_SYNC_OMITTE
1cf90 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  D: {.      retur
1cfa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
1cfb0 20 41 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20   A no-op */.    
1cfc0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1cfd0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
1cfe0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1cff0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1d000 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
1d010 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
1d020 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
1d030 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1d040 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
1d050 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
1d060 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
1d070 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
1d080 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
1d090 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
1d0a0 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
1d0b0 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
1d0c0 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
1d0d0 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
1d0e0 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
1d0f0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
1d100 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
1d110 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
1d120 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
1d130 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
1d140 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
1d150 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
1d160 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
1d170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1d180 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
1d190 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1d1a0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1d1b0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 70 46   = (unixFile*)pF
1d1c0 69 6c 65 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  ile;.  if( p->sz
1d1d0 53 65 63 74 6f 72 3d 3d 30 20 29 7b 0a 23 69 66  Sector==0 ){.#if
1d1e0 64 65 66 20 4d 49 53 53 49 4e 47 5f 53 54 41 54  def MISSING_STAT
1d1f0 56 46 53 0a 20 20 20 20 70 2d 3e 73 7a 53 65 63  VFS.    p->szSec
1d200 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  tor = SQLITE_DEF
1d210 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1d220 2f 35 31 32 3b 0a 23 65 6c 73 65 0a 20 20 20 20  /512;.#else.    
1d230 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20 78  struct statvfs x
1d240 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20  ;.    int sz;.  
1d250 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20    memset(&x, 0, 
1d260 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
1d270 6f 73 53 74 61 74 76 66 73 28 70 2d 3e 7a 50 61  osStatvfs(p->zPa
1d280 74 68 2c 20 26 78 29 3b 0a 20 20 20 20 73 7a 20  th, &x);.    sz 
1d290 3d 20 28 69 6e 74 29 78 2e 66 5f 66 72 73 69 7a  = (int)x.f_frsiz
1d2a0 65 3b 0a 20 20 20 20 69 66 28 20 73 7a 3c 35 31  e;.    if( sz<51
1d2b0 32 20 7c 7c 20 73 7a 3e 36 35 35 33 36 20 7c 7c  2 || sz>65536 ||
1d2c0 20 28 73 7a 26 28 73 7a 2d 31 29 29 21 3d 30 20   (sz&(sz-1))!=0 
1d2d0 29 7b 0a 20 20 20 20 20 20 73 7a 20 3d 20 53 51  ){.      sz = SQ
1d2e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1d2f0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  TOR_SIZE;.    }.
1d300 20 20 20 20 70 2d 3e 73 7a 53 65 63 74 6f 72 20      p->szSector 
1d310 3d 20 73 7a 2f 35 31 32 3b 0a 23 65 6e 64 69 66  = sz/512;.#endif
1d320 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
1d330 3e 73 7a 53 65 63 74 6f 72 2a 35 31 32 3b 0a 7d  >szSector*512;.}
1d340 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1d350 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
1d360 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
1d370 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
1d380 69 73 20 56 46 53 20 69 73 20 73 65 74 20 75 70  is VFS is set up
1d390 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
1d3a0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1d3b0 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20 64  E_OVERWRITE by d
1d3c0 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76  efault..** Howev
1d3d0 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20  er, that choice 
1d3e0 69 73 20 63 6f 6e 74 72 61 76 65 72 73 69 61 6c  is contraversial
1d3f0 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c   since technical
1d400 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ly the underlyin
1d410 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d  g.** file system
1d420 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73   does not always
1d430 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61   provide powersa
1d440 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20  fe overwrites.  
1d450 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72  (In other.** wor
1d460 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65  ds, after a powe
1d470 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61  r-loss event, pa
1d480 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20  rts of the file 
1d490 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a  that were never.
1d4a0 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  ** written might
1d4b0 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c   end up being al
1d4c0 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72  tered.)  However
1d4d0 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76  , non-PSOW behav
1d4e0 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20  ior is very,.** 
1d4f0 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20  very rare.  And 
1d500 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d  asserting PSOW m
1d510 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65 64  akes a large red
1d520 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d  uction in the am
1d530 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69  ount.** of requi
1d540 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72  red I/O for jour
1d550 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20  naling, since a 
1d560 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69  lot of padding i
1d570 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a  s eliminated..**
1d580 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50    Hence, while P
1d590 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1d5a0 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  TE is on by defa
1d5b0 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61 20  ult, there is a 
1d5c0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20  file-control.** 
1d5d0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72  available to tur
1d5e0 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49  n it off and URI
1d5f0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1d600 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75   available to tu
1d610 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74  rn it off..*/.st
1d620 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76  atic int unixDev
1d630 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1d640 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
1d650 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
1d660 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a   *p = (unixFile*
1d670 29 69 64 3b 0a 20 20 69 66 28 20 70 2d 3e 63 74  )id;.  if( p->ct
1d680 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
1d690 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72  LE_PSOW ){.    r
1d6a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
1d6b0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1d6c0 52 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  RWRITE;.  }else{
1d6d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d6e0 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
1d6f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a  LITE_OMIT_WAL...
1d700 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
1d710 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
1d720 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
1d730 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20  buffer.  .**.** 
1d740 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
1d750 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
1d760 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c  nce the same wal
1d770 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72  -index, each thr
1d780 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f  ead.** has its o
1d790 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  wn unixShm objec
1d7a0 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20  t, but they all 
1d7b0 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
1d7c0 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66  e instance.** of
1d7d0 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1d7e0 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  e object.  In ot
1d7f0 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20  her words, each 
1d800 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65  wal-index is ope
1d810 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65  ned.** only once
1d820 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
1d830 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d  .** Each unixShm
1d840 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
1d850 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69  onnected to a si
1d860 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ngle unixInodeIn
1d870 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65  fo object..** We
1d880 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20   could coalesce 
1d890 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f  this object into
1d8a0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20   unixInodeInfo, 
1d8b0 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d  but that would m
1d8c0 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65  ean.** every ope
1d8d0 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73  n file that does
1d8e0 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20   not use shared 
1d8f0 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72  memory (in other
1d900 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20   words, most.** 
1d910 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c  open files) woul
1d920 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20  d have to carry 
1d930 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72  around this extr
1d940 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  a information.  
1d950 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e  So.** the unixIn
1d960 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  odeInfo object c
1d970 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1d980 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68  r to this unixSh
1d990 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  mNode object.** 
1d9a0 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  and the unixShmN
1d9b0 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  ode object is cr
1d9c0 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20  eated only when 
1d9d0 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e  needed..**.** un
1d9e0 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  ixMutexHeld() mu
1d9f0 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
1da00 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
1da10 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
1da20 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
1da30 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1da40 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1da50 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
1da60 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68     nRef.**.** Th
1da70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1da80 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
1da90 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
1daa0 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
1dab0 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
1dac0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
1dad0 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69  **.** Either uni
1dae0 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  xShmNode.mutex m
1daf0 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75  ust be held or u
1db00 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
1db10 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75  =0 and.** unixMu
1db20 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
1db30 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
1db40 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
1db50 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
1db60 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
1db70 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
1db80 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e  mNode {.  unixIn
1db90 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
1dba0 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64       /* unixInod
1dbb0 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20  eInfo that owns 
1dbc0 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f  this SHM node */
1dbd0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1dbe0 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
1dbf0 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
1dc00 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
1dc10 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1dc20 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1dc30 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70  Name of the mmap
1dc40 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1dc50 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1dc60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
1dc70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1dc80 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
1dc90 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1dca0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
1dcb0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1dcc0 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69  s */.  u16 nRegi
1dcd0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1dce0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
1dcf0 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
1dd00 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20   u8 isReadonly; 
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1dd20 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79  rue if read-only
1dd30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52   */.  char **apR
1dd40 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1dd50 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70   /* Array of map
1dd60 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ped shared-memor
1dd70 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  y regions */.  i
1dd80 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1dd90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1dda0 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f  ber of unixShm o
1ddb0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1ddc0 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69  to this */.  uni
1ddd0 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  xShm *pFirst;   
1dde0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75          /* All u
1ddf0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
1de00 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
1de10 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1de20 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c  _DEBUG.  u8 excl
1de30 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1de40 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1de50 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1de60 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72  eld */.  u8 shar
1de70 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
1de80 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
1de90 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
1dea0 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d   */.  u8 nextShm
1deb0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
1dec0 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
1ded0 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61  le unixShm.id va
1dee0 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
1def0 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
1df00 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
1df10 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
1df20 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
1df30 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
1df40 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
1df50 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
1df60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
1df70 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
1df80 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
1df90 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
1dfa0 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
1dfb0 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
1dfc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53  :.**.**    unixS
1dfd0 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75  hm.pFile.**    u
1dfe0 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20  nixShm.id.**.** 
1dff0 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73  All other fields
1e000 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
1e010 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46    The unixShm.pF
1e020 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ile->mutex must 
1e030 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
1e040 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
1e050 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
1e060 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
1e070 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  Shm {.  unixShmN
1e080 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
1e090 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1e0a0 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ying unixShmNode
1e0b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69   object */.  uni
1e0c0 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  xShm *pNext;    
1e0d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1e0e0 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65  unixShm with the
1e0f0 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64   same unixShmNod
1e100 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
1e110 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
1e120 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
1e130 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d  ding the unixShm
1e140 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
1e150 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
1e160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
1e170 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
1e180 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75  ion within its u
1e190 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
1e1a0 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
1e1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1e1c0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1e1d0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
1e1e0 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
1e1f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1e200 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
1e210 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f  ks held */.};../
1e220 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
1e230 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
1e240 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
1e250 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
1e260 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1e270 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20  )*4)         /* 
1e280 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
1e290 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
1e2a0 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58  SHM_DMS    (UNIX
1e2b0 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
1e2c0 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
1e2d0 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
1e2e0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70  /../*.** Apply p
1e2f0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
1e300 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65  cks for all byte
1e310 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f  s from ofst thro
1e320 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a  ugh ofst+n-1..**
1e330 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20  .** Locks block 
1e340 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65  if the mask is e
1e350 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f  xactly UNIX_SHM_
1e360 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c  C and are non-bl
1e370 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77  ocking.** otherw
1e380 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1e390 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  nt unixShmSystem
1e3a0 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e  Lock(.  unixShmN
1e3b0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f  ode *pShmNode, /
1e3c0 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
1e3d0 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
1e3e0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1e3f0 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
1e400 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe,          /* 
1e410 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b  F_UNLCK, F_RDLCK
1e420 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a  , or F_WRLCK */.
1e430 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
1e440 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1e450 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f  t byte of the lo
1e460 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20  cking range */. 
1e470 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20   int n          
1e480 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e490 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
1e4a0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
1e4b0 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20  t flock f;      
1e4c0 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64   /* The posix ad
1e4d0 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73  visory locking s
1e4e0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
1e4f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e500 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f  ;   /* Result co
1e510 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20  de form fcntl() 
1e520 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
1e530 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  to the unixShmNo
1e540 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
1e550 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
1e560 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
1e570 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1e580 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  _held(pShmNode->
1e590 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f  mutex) || pShmNo
1e5a0 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  de->nRef==0 );..
1e5b0 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b    /* Shared lock
1e5c0 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72  s never span mor
1e5d0 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20  e than one byte 
1e5e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  */.  assert( n==
1e5f0 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46  1 || lockType!=F
1e600 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  _RDLCK );..  /* 
1e610 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e  Locks are within
1e620 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65   range */.  asse
1e630 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51  rt( n>=1 && n<SQ
1e640 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
1e650 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
1e660 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f  e->h>=0 ){.    /
1e670 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1e680 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
1e690 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ers */.    memse
1e6a0 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&f, 0, sizeof(
1e6b0 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70  f));.    f.l_typ
1e6c0 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20  e = lockType;.  
1e6d0 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53    f.l_whence = S
1e6e0 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c  EEK_SET;.    f.l
1e6f0 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20  _start = ofst;. 
1e700 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a     f.l_len = n;.
1e710 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
1e720 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46  l(pShmNode->h, F
1e730 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20  _SETLK, &f);.   
1e740 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29   rc = (rc!=(-1))
1e750 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
1e760 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
1e770 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
1e780 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
1e790 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
1e7a0 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
1e7b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1e7c0 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
1e7d0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1e7e0 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
1e7f0 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
1e800 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28  (1<<ofst);.  if(
1e810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e820 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
1e830 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
1e840 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
1e850 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  nlock %d ok", of
1e860 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
1e870 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  Node->exclMask &
1e880 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
1e890 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
1e8a0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1e8b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
1e8c0 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
1e8d0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1e8e0 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b  "read-lock %d ok
1e8f0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
1e900 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
1e910 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1e920 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
1e930 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
1e940 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e950 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
1e960 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
1e970 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1e980 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b  write-lock %d ok
1e990 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
1e9a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
1e9b0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1e9c0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
1e9d0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
1e9e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1e9f0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
1ea00 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
1ea10 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
1ea20 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c  lock %d failed",
1ea30 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c   ofst));.    }el
1ea40 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  se if( lockType=
1ea50 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
1ea60 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64    OSTRACE(("read
1ea70 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b  -lock failed"));
1ea80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ea90 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
1eaa0 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
1eab0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
1eac0 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69  rite-lock %d fai
1ead0 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
1eae0 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
1eaf0 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64  E((" - afterward
1eb00 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a  s %03x,%03x\n",.
1eb10 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
1eb20 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  ode->sharedMask,
1eb30 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
1eb40 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ask));.  }.#endi
1eb50 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  f..  return rc; 
1eb60 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a         .}.../*.*
1eb70 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78  * Purge the unix
1eb80 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
1eb90 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
1eba0 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  with unixShmNode
1ebb0 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
1ebc0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
1ebd0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
1ebe0 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
1ebf0 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
1ec00 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
1ec10 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
1ec20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
1ec30 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50  ic void unixShmP
1ec40 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  urge(unixFile *p
1ec50 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  Fd){.  unixShmNo
1ec60 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e  de *p = pFd->pIn
1ec70 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
1ec80 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
1ec90 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
1eca0 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d  ( p && p->nRef==
1ecb0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
1ecc0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1ecd0 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f  Inode==pFd->pIno
1ece0 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  de );.    sqlite
1ecf0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
1ed00 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28  mutex);.    for(
1ed10 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
1ed20 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
1ed30 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
1ed40 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e        munmap(p->
1ed50 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
1ed60 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
1ed70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ed80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1ed90 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
1eda0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1edb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1edc0 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
1edd0 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
1ede0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
1edf0 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49  (pFd, p->h, __LI
1ee00 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
1ee10 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
1ee20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68    p->pInode->pSh
1ee30 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  mNode = 0;.    s
1ee40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1ee50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
1ee60 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
1ee70 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
1ee80 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61  d with open data
1ee90 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
1eea0 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69    .** This parti
1eeb0 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
1eec0 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65  tion uses mmappe
1eed0 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  d files..**.** T
1eee0 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  he file used to 
1eef0 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64  implement shared
1ef00 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68  -memory is in th
1ef10 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
1ef20 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20  .** as the open 
1ef30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1ef40 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  d has the same n
1ef50 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20  ame as the open 
1ef60 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1ef70 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22   with the "-shm"
1ef80 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20   suffix added.  
1ef90 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1efa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1efb0 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75  e.** is "/home/u
1efc0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20  ser1/config.db" 
1efd0 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68  then the file th
1efe0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  at is created an
1eff0 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72  d mmapped.** for
1f000 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
1f010 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f  ill be called "/
1f020 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
1f030 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a  g.db-shm".  .**.
1f040 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f  ** Another appro
1f050 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65  ach to is to use
1f060 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73   files in /dev/s
1f070 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f  hm or /dev/tmp o
1f080 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  r an.** some oth
1f090 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20  er tmpfs mount. 
1f0a0 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
1f0b0 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
1f0c0 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74  ectory.** from t
1f0d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f0e0 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64   is used, then d
1f0f0 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
1f100 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f  permissions.** o
1f110 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67  r a chroot() mig
1f120 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66  ht cause two dif
1f130 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73  ferent processes
1f140 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
1f150 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20  database to end 
1f160 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65  up using differe
1f170 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61  nt files for sha
1f180 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a  red memory - .**
1f190 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
1f1a0 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64  eir memory would
1f1b0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73   not really be s
1f1c0 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e  hared - resultin
1f1d0 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  g.** in database
1f1e0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65   corruption.  Ne
1f1f0 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73  vertheless, this
1f200 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67   tmpfs file usag
1f210 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62  e.** can be enab
1f220 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
1f230 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ime using -DSQLI
1f240 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1f250 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f  ="/dev/shm".** o
1f260 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
1f270 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  .  The use of th
1f280 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
1f290 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
1f2a0 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65  ime.** option re
1f2b0 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f  sults in an inco
1f2c0 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f  mpatible build o
1f2d0 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64  f SQLite;  build
1f2e0 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74  s of SQLite.** t
1f2f0 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69  hat with differi
1f300 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ng SQLITE_SHM_DI
1f310 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73  RECTORY settings
1f320 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
1f330 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61  the.** same data
1f340 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
1f350 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61   same time, data
1f360 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1f370 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
1f380 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54  esult. The SQLIT
1f390 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
1f3a0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
1f3b0 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ion is considere
1f3c0 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65  d.** "unsupporte
1f3d0 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77  d" and may go aw
1f3e0 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53  ay in a future S
1f3f0 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a  QLite release..*
1f400 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
1f410 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
1f420 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
1f430 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
1f440 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
1f450 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
1f460 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
1f470 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
1f480 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
1f490 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
1f4a0 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
1f4b0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
1f4c0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
1f4d0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  r cleared..**.**
1f4e0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
1f4f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1f500 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20  pDbFd) is using 
1f510 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  the "unix-excl" 
1f520 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  VFS.** that mean
1f530 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73  s that an exclus
1f540 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
1f550 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1f560 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61   file and.** tha
1f570 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
1f580 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  sses are able to
1f590 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
1f5a0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  he database.  In
1f5b0 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77  .** that case, w
1f5c0 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e do not really 
1f5d0 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f  need shared memo
1f5e0 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d  ry.  No shared m
1f5f0 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73  emory.** file is
1f600 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73   created.  The s
1f610 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
1f620 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77  l be simulated w
1f630 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e  ith heap memory.
1f640 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1f650 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
1f660 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
1f670 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
1f680 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
1f690 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1f6a0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1f6b0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
1f6c0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
1f6d0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
1f6e0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
1f6f0 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
1f700 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1f730 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
1f740 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
1f750 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
1f760 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
1f770 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20   *zShmFilename; 
1f780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f790 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1f7a0 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a  used for SHM */.
1f7b0 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61    int nShmFilena
1f7c0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
1f7d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1f7e0 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e   SHM filename in
1f7f0 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
1f800 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1f810 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53  or the new unixS
1f820 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  hm object. */.  
1f830 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
1f840 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
1f850 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1f860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1f870 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
1f880 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
1f890 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
1f8a0 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
1f8b0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1f8c0 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
1f8d0 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
1f8e0 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
1f8f0 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
1f900 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
1f910 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
1f920 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
1f930 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
1f940 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
1f950 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
1f960 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
1f970 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
1f980 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
1f990 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1f9a0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
1f9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
1f9c0 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
1f9d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1f9e0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74  .    /* Call fst
1f9f0 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  at() to figure o
1fa00 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ut the permissio
1fa10 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ns on the databa
1fa20 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20  se file. If.    
1fa30 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66  ** a new *-shm f
1fa40 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
1fa50 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20  an attempt will 
1fa60 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74  be made to creat
1fa70 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68  e it.    ** with
1fa80 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
1fa90 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75 61  sions. The actua
1faa0 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74 68  l permissions th
1fab0 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  e file is create
1fac0 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 72  d.    ** with ar
1fad0 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  e subject to the
1fae0 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20 73   current umask s
1faf0 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  etting..    */. 
1fb00 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1fb10 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29  DbFd->h, &sStat)
1fb20 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f   && pInode->bPro
1fb30 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
1fb40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fb50 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1fb60 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1fb70 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69  n_err;.    }..#i
1fb80 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
1fb90 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53  DIRECTORY.    nS
1fba0 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a  hmFilename = siz
1fbb0 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44  eof(SQLITE_SHM_D
1fbc0 49 52 45 43 54 4f 52 59 29 20 2b 20 33 30 3b 0a  IRECTORY) + 30;.
1fbd0 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69  #else.    nShmFi
1fbe0 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69 6e  lename = 5 + (in
1fbf0 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e  t)strlen(pDbFd->
1fc00 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20  zPath);.#endif. 
1fc10 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71     pShmNode = sq
1fc20 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
1fc30 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
1fc40 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29  + nShmFilename )
1fc50 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1fc60 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
1fc70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1fc80 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1fc90 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1fca0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d  .    memset(pShm
1fcb0 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Node, 0, sizeof(
1fcc0 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a 20 20 20  *pShmNode));.   
1fcd0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   zShmFilename = 
1fce0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
1fcf0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53  ame = (char*)&pS
1fd00 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65  hmNode[1];.#ifde
1fd10 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
1fd20 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74  ECTORY.    sqlit
1fd30 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
1fd40 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
1fd50 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  lename, .       
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1fd70 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1fd80 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d  RY "/sqlite-shm-
1fd90 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20  %x-%x",.        
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
1fdb0 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20  2)sStat.st_ino, 
1fdc0 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65  (u32)sStat.st_de
1fdd0 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71  v);.#else.    sq
1fde0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
1fdf0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
1fe00 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  mFilename, "%s-s
1fe10 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
1fe20 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
1fe30 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
1fe40 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c  ->zPath, zShmFil
1fe50 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
1fe60 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
1fe70 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e   -1;.    pDbFd->
1fe80 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
1fe90 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20   = pShmNode;.   
1fea0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
1feb0 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
1fec0 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
1fed0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
1fee0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1fef0 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
1ff00 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
1ff10 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
1ff20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ff30 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
1ff40 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1ff50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1ff60 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
1ff70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
1ff80 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
1ff90 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
1ffa0 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  T;.      if( sql
1ffb0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
1ffc0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22  (pDbFd->zPath, "
1ffd0 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30  readonly_shm", 0
1ffe0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65  ) ){.        ope
1fff0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
20000 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  Y;.        pShmN
20010 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
20020 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
20030 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
20040 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
20050 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46  mFilename, openF
20060 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f  lags, (sStat.st_
20070 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20  mode&0777));.   
20080 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
20090 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >h<0 ){.        
200a0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  if( pShmNode->h<
200b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
200c0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
200d0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
200e0 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
200f0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
20100 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
20110 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
20120 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
20130 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
20140 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
20150 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
20160 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
20170 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
20180 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
20190 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
201a0 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
201b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
201c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
201d0 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
201e0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
201f0 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
20200 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
20210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20220 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
20230 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
20240 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
20250 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
20260 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
20270 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72  RR_SHMOPEN, "ftr
20280 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c  uncate", zShmFil
20290 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
202a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
202b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
202c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
202d0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
202e0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
202f0 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  RDLCK, UNIX_SHM_
20300 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  DMS, 1);.      }
20310 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
20320 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
20330 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
20340 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
20350 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
20360 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68  ld of the unixSh
20370 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
20380 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
20390 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
203a0 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
203b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
203c0 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
203d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
203e0 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
203f0 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76   = p;.  unixLeav
20400 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
20410 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
20420 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
20430 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
20440 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
20450 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
20460 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74  r of the unixEnt
20470 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
20480 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
20490 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
204a0 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68  w (struct unixSh
204b0 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
204c0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
204d0 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
204e0 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
204f0 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
20500 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
20510 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
20520 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
20530 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
20540 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
20550 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
20560 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f  lding the pShmNo
20570 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20  de->mutex .  ** 
20580 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  mutex..  */.  sq
20590 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
205a0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
205b0 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  x);.  p->pNext =
205c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
205d0 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  t;.  pShmNode->p
205e0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c  First = p;.  sql
205f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
20600 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
20610 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
20620 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
20630 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
20640 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
20650 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
20660 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
20670 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
20680 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
20690 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
206a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
206b0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
206c0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
206d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
206e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
206f0 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
20700 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
20710 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
20720 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
20730 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20750 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
20760 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
20770 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
20780 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
20790 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
207a0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
207b0 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
207c0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
207d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
207e0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
207f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
20800 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
20810 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
20820 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
20830 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
20840 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
20850 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
20860 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
20870 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
20880 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
20890 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
208a0 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
208b0 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
208c0 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
208d0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
208e0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
208f0 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
20900 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
20910 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
20920 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
20930 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
20940 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
20950 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
20960 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
20970 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
20980 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
20990 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
209a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
209b0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
209c0 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
209d0 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
209e0 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
209f0 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
20a00 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
20a10 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
20a20 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
20a30 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
20a40 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
20a50 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
20a60 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
20a70 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
20a80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20a90 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
20aa0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ac0 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
20ad0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
20ae0 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b00 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
20b10 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
20b20 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20b40 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
20b50 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
20b60 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
20b70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
20b80 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
20b90 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
20ba0 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
20bb0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
20bc0 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
20bd0 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
20be0 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
20bf0 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
20c00 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
20c10 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
20c20 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
20c30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
20c40 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
20c50 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e  emory file has n
20c60 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
20c70 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
20c80 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d   */.  if( pDbFd-
20c90 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >pShm==0 ){.    
20ca0 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61  rc = unixOpenSha
20cb0 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29  redMemory(pDbFd)
20cc0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20cd0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
20ce0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20   rc;.  }..  p = 
20cf0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70  pDbFd->pShm;.  p
20d00 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
20d10 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33  mNode;.  sqlite3
20d20 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
20d30 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
20d40 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f   assert( szRegio
20d50 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52  n==pShmNode->szR
20d60 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64  egion || pShmNod
20d70 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b  e->nRegion==0 );
20d80 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
20d90 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
20da0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
20db0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
20dc0 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d  ->h>=0 || pDbFd-
20dd0 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
20de0 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  sLock==1 );.  as
20df0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
20e00 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  h<0 || pDbFd->pI
20e10 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
20e20 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ck==0 );..  if( 
20e30 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
20e40 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  n<=iRegion ){.  
20e50 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20    char **apNew; 
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e70 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65       /* New apRe
20e80 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
20e90 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
20ea0 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
20eb0 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
20ec0 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
20ed0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
20ee0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f00 2a 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28  * Used by fstat(
20f10 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ) */..    pShmNo
20f20 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
20f30 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66  zRegion;..    if
20f40 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
20f50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
20f60 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
20f70 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
20f80 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
20f90 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
20fa0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63  e..      ** Chec
20fb0 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68  k to see if it h
20fc0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
20fd0 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77  d (i.e. if the w
20fe0 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73  al-index file is
20ff0 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  .      ** large 
21000 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
21010 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
21020 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a  region)..      *
21030 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  /.      if( osFs
21040 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  tat(pShmNode->h,
21050 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
21060 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21070 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20  IOERR_SHMSIZE;. 
21080 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
21090 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
210a0 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53  .  .      if( sS
210b0 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74  tat.st_size<nByt
210c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
210d0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
210e0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
210f0 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62   not exist. If b
21100 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f  Extend is set to
21110 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73  .        ** fals
21120 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a  e, exit early. *
21130 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  pp will be set t
21140 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
21150 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20  E_OK returned.. 
21160 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
21170 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    ** Alternative
21180 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69  ly, if bExtend i
21190 73 20 74 72 75 65 2c 20 75 73 65 20 66 74 72 75  s true, use ftru
211a0 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63  ncate() to alloc
211b0 61 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ate.        ** t
211c0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
211d0 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20  ory region..    
211e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
211f0 66 28 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f  f( !bExtend ) go
21200 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
21210 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
21220 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
21230 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29  mNode->h, nByte)
21240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
21250 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
21260 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
21270 53 49 5a 45 2c 20 22 66 74 72 75 6e 63 61 74 65  SIZE, "ftruncate
21280 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
212a0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
212b0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
212c0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
212d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
212e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
212f0 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
21300 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
21310 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
21320 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
21330 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
21340 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
21350 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
21360 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
21370 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  pRegion, (iRegio
21380 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72  n+1)*sizeof(char
21390 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   *).    );.    i
213a0 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
213b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
213c0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
213d0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
213e0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
213f0 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
21400 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68   = apNew;.    wh
21410 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ile(pShmNode->nR
21420 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b  egion<=iRegion){
21430 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65  .      void *pMe
21440 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  m;.      if( pSh
21450 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
21460 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d         pMem = mm
21470 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a  ap(0, szRegion,.
21480 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
21490 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
214a0 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50   ? PROT_READ : P
214b0 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52  ROT_READ|PROT_WR
214c0 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ITE, .          
214d0 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53    MAP_SHARED, pS
214e0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e  hmNode->h, pShmN
214f0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
21500 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b  egion.        );
21510 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
21520 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  m==MAP_FAILED ){
21530 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21540 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
21550 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
21560 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f  , "mmap", pShmNo
21570 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
21580 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
21590 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
215a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
215b0 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  e{.        pMem 
215c0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
215d0 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
215e0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
215f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21600 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
21610 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
21620 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
21630 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
21640 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a  mset(pMem, 0, sz
21650 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
21660 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21670 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  >apRegion[pShmNo
21680 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70  de->nRegion] = p
21690 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Mem;.      pShmN
216a0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a  ode->nRegion++;.
216b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61      }.  }..shmpa
216c0 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53  ge_out:.  if( pS
216d0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e  hmNode->nRegion>
216e0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a  iRegion ){.    *
216f0 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  pp = pShmNode->a
21700 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  pRegion[iRegion]
21710 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
21720 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  pp = 0;.  }.  if
21730 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65  ( pShmNode->isRe
21740 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51  adonly && rc==SQ
21750 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
21760 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
21770 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
21780 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
21790 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
217a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
217b0 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
217c0 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
217d0 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
217e0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
217f0 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
21800 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64  p between SHAREd
21810 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c   and EXCLUSIVE l
21820 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ocks is a little
21830 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65  .** different he
21840 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78  re than in posix
21850 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29  .  In xShmLock()
21860 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f  , one can go fro
21870 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f  m unlocked.** to
21880 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b   shared and back
21890 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   or from unlocke
218a0 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61  d to exclusive a
218b0 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e  nd back.  But on
218c0 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20  e may.** not go 
218d0 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65  from shared to e
218e0 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d  xclusive or from
218f0 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68   exclusive to sh
21900 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
21910 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28  int unixShmLock(
21920 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
21930 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
21940 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
21950 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
21960 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
21970 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
21980 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
21990 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
219a0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
219b0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
219d0 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
219e0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
219f0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
21a00 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
21a10 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
21a20 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
21a30 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  k */.){.  unixFi
21a40 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
21a50 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  xFile*)fd;      
21a60 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
21a70 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
21a80 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ory */.  unixShm
21a90 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
21aa0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
21ab0 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
21ac0 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
21ad0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
21ae0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
21af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21b00 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
21b10 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
21b20 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
21b30 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
21b40 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75  mNode;  /* The u
21b50 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69  nderlying file i
21b60 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Node */.  int rc
21b70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b90 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
21ba0 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
21bd0 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
21be0 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
21bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
21c00 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
21c10 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
21c20 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
21c30 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
21c40 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
21c50 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
21c60 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
21c70 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
21c80 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
21c90 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
21ca0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
21cb0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
21cc0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
21cd0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
21ce0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
21cf0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
21d00 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
21d10 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
21d20 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
21d30 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
21d40 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
21d50 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
21d60 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
21d70 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
21d80 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
21d90 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
21da0 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
21db0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
21dc0 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
21dd0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
21de0 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
21df0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
21e00 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
21e10 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
21e20 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d  sLock==0 );..  m
21e30 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b  ask = (1<<(ofst+
21e40 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
21e50 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
21e60 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
21e70 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
21e80 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
21e90 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
21ea0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
21eb0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
21ec0 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
21ed0 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
21ee0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
21ef0 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
21f00 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
21f10 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
21f20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
21f30 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
21f40 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
21f50 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
21f60 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
21f70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
21f80 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
21f90 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
21fa0 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
21fb0 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
21fc0 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
21fd0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
21fe0 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
21ff0 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
22000 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
22010 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
22020 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
22030 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
22040 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
22050 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_UNLCK, ofst+UN
22060 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
22070 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22080 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
22090 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
220a0 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
220b0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
220c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
220d0 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
220e0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
220f0 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
22100 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
22110 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
22120 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
22130 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
22140 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
22150 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
22160 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
22170 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
22180 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
22190 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
221a0 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
221b0 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
221c0 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
221d0 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
221e0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
221f0 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
22200 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
22210 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
22220 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
22230 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
22240 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
22250 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
22260 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
22270 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
22280 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
22290 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
222a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
222b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
222c0 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
222d0 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
222e0 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
222f0 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
22300 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
22310 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
22320 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
22330 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22340 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
22350 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
22360 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22370 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
22380 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
22390 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_RDLCK, ofst+U
223a0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
223b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
223c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
223d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
223e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
223f0 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
22400 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
22410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22420 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
22430 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
22440 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
22450 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
22460 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
22470 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
22480 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
22490 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
224a0 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
224b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
224c0 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
224d0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
224e0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
224f0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
22500 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
22510 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
22520 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
22530 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
22540 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
22550 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
22560 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
22570 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
22580 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20  }.  .    /* Get 
22590 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
225a0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
225b0 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
225c0 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
225d0 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
225e0 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
225f0 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
22600 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
22610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22620 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
22630 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
22640 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c  (pShmNode, F_WRL
22650 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
22660 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
22670 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22680 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
22690 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
226a0 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
226b0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
226c0 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
226d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
226e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
226f0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
22700 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
22710 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
22720 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
22730 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e   got %03x,%03x\n
22740 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
22750 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70  >id, getpid(), p
22760 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
22770 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72  >exclMask));.  r
22780 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22790 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
227a0 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
227b0 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
227c0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
227d0 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
227e0 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
227f0 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
22800 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
22810 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
22820 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
22830 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
22840 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
22850 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42  ic void unixShmB
22860 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65  arrier(.  sqlite
22870 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20  3_file *fd      
22880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
22890 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
228a0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
228b0 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
228c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
228d0 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
228e0 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61  tex();.  unixLea
228f0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
22900 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
22910 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
22920 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
22930 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
22940 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
22950 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
22960 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
22970 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
22980 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
22990 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
229a0 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
229b0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
229c0 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
229d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
229e0 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
229f0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22a10 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
22a20 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
22a30 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a50 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
22a60 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
22a70 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
22a80 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
22a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22aa0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
22ab0 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
22ac0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
22ad0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
22ae0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
22af0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
22b00 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
22b10 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
22b20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
22b30 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
22b40 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
22b50 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
22b60 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
22b70 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
22b80 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
22b90 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
22ba0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
22bb0 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
22bc0 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
22bd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22be0 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
22bf0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
22c00 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
22c10 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
22c20 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
22c30 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
22c40 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
22c50 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
22c60 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
22c70 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
22c80 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
22c90 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
22ca0 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
22cb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
22cc0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
22cd0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
22ce0 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
22cf0 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
22d00 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
22d10 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
22d20 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
22d30 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
22d40 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
22d50 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
22d60 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
22d70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
22d80 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
22d90 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
22da0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
22db0 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
22dc0 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
22dd0 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
22de0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
22df0 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  oo */.  unixEnte
22e00 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
22e10 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
22e20 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
22e30 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
22e40 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
22e50 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
22e60 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68  eleteFlag && pSh
22e70 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73  mNode->h>=0 ) os
22e80 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
22e90 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
22ea0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
22eb0 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
22ec0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
22ed0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22ee0 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64  K;.}...#else.# d
22ef0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70  efine unixShmMap
22f00 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
22f10 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30  unixShmLock    0
22f20 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
22f30 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
22f40 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  ine unixShmUnmap
22f50 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
22f60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22f70 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
22f80 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
22f90 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
22fa0 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
22fb0 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
22fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22fd0 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
22fe0 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
22ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
23010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
23060 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
23070 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  on contains defi
23080 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74  nitions of sqlit
23090 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
230a0 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d  jects that.** im
230b0 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20  plement various 
230c0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  file locking str
230d0 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73  ategies.  It als
230e0 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  o contains defin
230f0 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69  itions.** of "fi
23100 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e  nder" functions.
23110 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74    A finder-funct
23120 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ion is used to l
23130 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70  ocate the approp
23140 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33  riate.** sqlite3
23150 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
23160 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ct for a particu
23170 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  lar database fil
23180 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  e.  The pAppData
23190 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
231a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53   sqlite3_vfs VFS
231b0 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69   objects are ini
231c0 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70  tialized to be p
231d0 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68  ointers to.** th
231e0 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72  e correct finder
231f0 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68  -function for th
23200 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  at VFS..**.** Mo
23210 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  st finder functi
23220 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ons return a poi
23230 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
23240 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23250 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54  ds.** object.  T
23260 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74  he only interest
23270 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ing finder-funct
23280 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49  ion is autolockI
23290 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a  oFinder, which.*
232a0 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  * looks at the f
232b0 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61  ilesystem type a
232c0 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73  nd tries to gues
232d0 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  s the best locki
232e0 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66  ng.** strategy f
232f0 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20  rom that..**.** 
23300 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69  For finder-funti
23310 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74  on F, two object
23320 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a  s are created:.*
23330 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20  *.**    (1) The 
23340 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63  real finder-func
23350 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70  tion named "FImp
23360 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  t()"..**.**    (
23370 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f  2) A constant po
23380 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75  inter to this fu
23390 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73  nction named jus
233a0 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  t "F"..**.**.** 
233b0 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
233c0 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73   F pointer is us
233d0 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61  ed as the pAppDa
233e0 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53  ta value for VFS
233f0 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65  .** objects.  We
23400 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
23410 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
23420 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69  ing pAppData poi
23430 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61  nt.** directly a
23440 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e  t the finder-fun
23450 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20  ction since C90 
23460 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20  rules prevent a 
23470 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65  void*.** from be
23480 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e   cast into a fun
23490 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
234a0 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  *.**.** Each ins
234b0 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61  tance of this ma
234c0 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77  cro generates tw
234d0 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a  o objects:.**.**
234e0 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74     *  A constant
234f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23500 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20  ods object call 
23510 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20  METHOD that has 
23520 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  locking.**      
23530 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c  methods CLOSE, L
23540 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52  OCK, UNLOCK, CKR
23550 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20  ESLOCK..**.**   
23560 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64  *  An I/O method
23570 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
23580 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74   called FINDER t
23590 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  hat returns a po
235a0 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f  inter.**      to
235b0 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65   the METHOD obje
235c0 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ct in the previo
235d0 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64  us bullet..*/.#d
235e0 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28  efine IOMETHODS(
235f0 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20  FINDER, METHOD, 
23600 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20  VERSION, CLOSE, 
23610 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
23620 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61  LOCK)      \.sta
23630 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
23640 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54  3_io_methods MET
23650 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20  HOD = {         
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23670 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56            \.   V
23680 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
23690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
236a0 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c           \.   CL
236d0 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
236e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
236f0 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
23720 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  xRead,          
23730 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
23740 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
23770 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
23780 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
23790 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54        \.   unixT
237c0 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
237d0 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
237e0 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ate */          
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23800 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79       \.   unixSy
23810 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
23820 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
23830 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
23860 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
23870 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
23880 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20     \.   LOCK,   
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238c0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20      /* xLock */ 
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20    \.   UNLOCK,  
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20   \.   CKLOCK,   
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
23970 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  \.   unixFileCon
239a0 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
239b0 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
239c0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
239e0 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  .   unixSectorSi
239f0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
23a00 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
23a10 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23a30 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61     unixDeviceCha
23a40 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
23a50 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c  * xDeviceCapabil
23a60 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20  ities */        
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
23a80 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20    unixShmMap,   
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23aa0 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20   xShmMap */     
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
23ad0 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23af0 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23b20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20  unixShmBarrier, 
23b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23b40 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20  ShmBarrier */   
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b60 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
23b70 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20  nixShmUnmap     
23b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
23b90 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20  hmUnmap */      
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bb0 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20           \.};   
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
23c10 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
23c20 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45  o_methods *FINDE
23c30 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68  R##Impl(const ch
23c40 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20  ar *z, unixFile 
23c50 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45  *p){   \.  UNUSE
23c60 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20  D_PARAMETER(z); 
23c70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
23c80 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  (p);            
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ca0 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e        \.  return
23cb0 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20   &METHOD;       
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20       \.}        
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
23d50 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
23d60 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46  thods *(*const F
23d70 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61  INDER)(const cha
23d80 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20  r*,unixFile *p) 
23d90 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45     \.    = FINDE
23da0 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  R##Impl;../*.** 
23db0 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20  Here are all of 
23dc0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
23dd0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66  ethods objects f
23de0 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  or each of the.*
23df0 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  * locking strate
23e00 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73  gies.  Functions
23e10 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69   that return poi
23e20 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d  nters to these m
23e30 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c  ethods.** are al
23e40 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49  so created..*/.I
23e50 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69  OMETHODS(.  posi
23e60 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  xIoFinder,      
23e70 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
23e80 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
23e90 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  .  posixIoMethod
23ea0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
23eb0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23ec0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
23ed0 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  /.  2,          
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23ef0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
23f00 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  s enabled */.  u
23f10 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
23f20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23f30 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
23f40 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
23f50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
23f60 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
23f70 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
23f80 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
23f90 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
23fa0 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
23fb0 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65  Lock     /* xChe
23fc0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
23fd0 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
23fe0 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  HODS(.  nolockIo
23ff0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
24000 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
24010 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
24020 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  olockIoMethods, 
24030 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
24040 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
24050 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
24060 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
24070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
24080 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
24090 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  sabled */.  nolo
240a0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
240b0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
240c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
240d0 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
240e0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
240f0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
24100 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
24110 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
24120 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
24130 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
24140 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ock   /* xCheckR
24150 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
24160 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
24170 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
24180 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
24190 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
241a0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
241b0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
241c0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
241d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
241e0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24200 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
24210 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
24220 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
24230 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
24240 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
24250 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
24260 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
24270 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
24280 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
24290 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
242a0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
242b0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
242c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
242d0 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k  /* xCheckRese
242e0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
242f0 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  */.)..#if SQLITE
24300 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24310 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
24320 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
24330 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
24340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24350 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
24360 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
24370 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
24380 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
24390 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
243a0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243c0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
243d0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
243e0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
243f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24400 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
24410 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
24440 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
24450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
24460 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
24470 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
24480 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
24490 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
244a0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
244b0 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
244c0 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
244d0 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
244e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
244f0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
24500 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
24510 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
24520 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
24530 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
24540 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24560 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
24570 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
24580 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f  bled */.  semClo
24590 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
245a0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
245b0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63  thod */.  semLoc
245c0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
245d0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
245e0 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f  hod */.  semUnlo
245f0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
24600 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
24610 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65  thod */.  semChe
24620 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
24630 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
24640 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
24650 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
24660 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
24670 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
24680 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
24690 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
246a0 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20   afpIoFinder,   
246b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
246c0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
246d0 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74  me */.  afpIoMet
246e0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
246f0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
24700 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
24710 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24730 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
24740 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
24750 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20  */.  afpClose,  
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24770 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
24780 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20  */.  afpLock,   
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
247a0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
247b0 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20  /.  afpUnlock,  
247c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
247d0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
247e0 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73  */.  afpCheckRes
247f0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
24800 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
24810 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
24820 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
24830 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
24840 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
24850 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
24860 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
24870 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
24880 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
24890 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
248a0 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
248b0 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
248c0 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
248d0 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
248e0 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
248f0 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
24900 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
24910 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
24920 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
24930 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
24940 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
24950 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
24960 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
24970 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
24980 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
24990 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
249a0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
249b0 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
249c0 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
249d0 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
249e0 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
249f0 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
24a00 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
24a10 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
24a20 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
24a30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
24a40 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
24a50 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
24a60 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
24a70 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
24a80 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
24a90 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
24aa0 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
24ab0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
24ac0 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
24ad0 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
24ae0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
24af0 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
24b00 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
24b10 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
24b20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
24b30 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
24b40 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
24b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
24b60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
24b70 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
24b80 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
24b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
24ba0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
24bb0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f  isabled */.  pro
24bc0 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
24bd0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
24be0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
24bf0 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
24c00 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
24c10 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
24c20 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
24c30 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
24c40 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
24c50 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
24c60 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
24c70 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
24c80 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
24c90 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
24ca0 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
24cb0 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
24cc0 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
24cd0 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
24ce0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
24cf0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
24d00 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24d10 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
24d20 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d40 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
24d50 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
24d60 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
24d70 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
24d80 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
24d90 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
24dc0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
24dd0 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
24de0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
24df0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
24e00 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
24e10 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
24e20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
24e30 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
24e40 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
24e50 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
24e60 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
24e70 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
24e80 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
24e90 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
24ea0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
24eb0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
24ec0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
24ed0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
24ee0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
24ef0 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
24f00 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
24f10 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
24f20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
24f30 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
24f40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24f50 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
24f60 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
24f70 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24f80 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
24f90 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
24fa0 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
24fb0 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
24fc0 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
24fd0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
24fe0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
24ff0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
25000 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
25010 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
25020 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
25030 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25040 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
25050 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  w           /* o
25060 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
25070 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
25080 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74   file */.){.  st
25090 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
250a0 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20  t Mapping {.    
250b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
250c0 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20  esystem;        
250d0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73        /* Filesys
250e0 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f  tem type name */
250f0 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
25100 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
25110 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70  Methods;   /* Ap
25120 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
25130 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20  g method */.  } 
25140 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMap[] = {.    {
25150 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "hfs",    &posi
25160 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
25170 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70    { "ufs",    &p
25180 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
25190 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
251a0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
251b0 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  ,.    { "smbfs",
251c0 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
251d0 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
251e0 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  ", &nolockIoMeth
251f0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20  ods },.    { 0, 
25200 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  0 }.  };.  int i
25210 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
25220 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75  s fsInfo;.  stru
25230 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
25240 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
25250 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
25260 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
25270 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
25280 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
25290 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
252a0 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
252b0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
252c0 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
252d0 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
252e0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66  ethods;.  }.  if
252f0 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74  ( statfs(filePat
25300 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
25310 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49  1 ){.    if( fsI
25320 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e  nfo.f_flags & MN
25330 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  T_RDONLY ){.    
25340 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
25350 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
25360 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
25370 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
25380 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
25390 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
253a0 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
253b0 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
253c0 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
253d0 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
253e0 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  .pMethods;.     
253f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
25400 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e  /* Default case.
25410 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73   Handles, amongs
25420 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e  t others, "nfs".
25430 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d  .  ** Test byte-
25440 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
25450 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
25460 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
25470 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
25480 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
25490 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
254a0 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
254b0 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
254c0 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
254d0 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
254e0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
254f0 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
25500 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
25510 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
25520 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
25530 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
25540 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
25550 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
25560 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
25570 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
25580 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
25590 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
255a0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
255b0 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
255c0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
255d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
255e0 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
255f0 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
25600 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
25610 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
25620 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
25630 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
25640 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
25650 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
25660 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
25670 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
25680 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
25690 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
256a0 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
256b0 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
256c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
256d0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
256e0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
256f0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
25700 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
25710 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
25720 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
25730 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25740 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
25750 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
25760 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
25770 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
25780 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
25790 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
257a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
257b0 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f  VXWorks only..*/
257c0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
257d0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
257e0 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
257f0 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
25800 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
25810 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
25820 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25830 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
25840 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
25850 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
25860 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
25870 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
25880 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
25890 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
258a0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
258b0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
258c0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
258d0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
258e0 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
258f0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
25900 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
25910 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
25920 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
25930 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
25940 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
25950 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
25960 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
25970 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
25980 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
25990 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
259a0 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
259b0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
259c0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
259d0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
259e0 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
259f0 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
25a00 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
25a10 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
25a20 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
25a30 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
25a40 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
25a50 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
25a60 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
25a70 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
25a80 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
25a90 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
25aa0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
25ab0 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
25ac0 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
25ad0 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
25ae0 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
25af0 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
25b00 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26   /* OS_VXWORKS &
25b10 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
25b20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
25b30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72  ../*.** An abstr
25b40 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70  act type for a p
25b50 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d  ointer to a IO m
25b60 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
25b70 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
25b80 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
25b90 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
25ba0 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
25bb0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
25bc0 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
25bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c10 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
25c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
25c30 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
25c40 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
25c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
25c70 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
25c80 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
25c90 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
25ca0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
25cb0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
25cc0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
25cd0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25ce0 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
25cf0 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
25d00 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
25d10 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
25d20 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
25d30 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
25d40 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
25d50 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
25d60 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
25d70 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
25d80 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
25d90 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
25da0 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ned */.  int syn
25db0 63 44 69 72 2c 20 20 20 20 20 20 20 20 20 20 20  cDir,           
25dc0 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 79 6e 63   /* True to sync
25dd0 20 64 69 72 65 63 74 6f 72 79 20 6f 6e 20 66 69   directory on fi
25de0 72 73 74 20 73 79 6e 63 20 2a 2f 0a 20 20 73 71  rst sync */.  sq
25df0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
25e00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
25e10 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
25e20 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
25e30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25e40 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
25e50 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
25e60 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
25e70 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20   int noLock,    
25e80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74           /* Omit
25e90 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65   locking if true
25ea0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65   */.  int isDele
25eb0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
25ec0 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65   Delete on close
25ed0 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
25ee0 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 20 20 20  t isReadOnly    
25ef0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25f00 20 74 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65   the file is ope
25f10 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  ned read-only */
25f20 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  .){.  const sqli
25f30 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
25f40 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
25f50 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
25f60 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
25f70 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
25f80 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
25f90 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  rt( pNew->pInode
25fa0 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20  ==NULL );..  /* 
25fb0 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65  Parameter isDele
25fc0 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  te is only used 
25fd0 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72  on vxworks. Expr
25fe0 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69  ess this explici
25ff0 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74  tly .  ** here t
26000 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c  o prevent compil
26010 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75  er warnings abou
26020 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74  t unused paramet
26030 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ers..  */.  UNUS
26040 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
26050 65 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55 73  elete);..  /* Us
26060 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a  ually the path z
26070 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20  Filename should 
26080 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  not be a relativ
26090 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a  e pathname. The.
260a0 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69    ** exception i
260b0 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  s when opening t
260c0 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22  he proxy "conch"
260d0 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20   file in builds 
260e0 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  that.  ** includ
260f0 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70  e the special Ap
26100 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  ple locking styl
26110 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  es..  */.#if def
26120 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
26130 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
26140 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
26150 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
26160 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
26170 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  me[0]=='/' .    
26180 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  || pVfs->pAppDat
26190 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c  a==(void*)&autol
261a0 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23  ockIoFinder );.#
261b0 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a  else.  assert( z
261c0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
261d0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
261e0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
261f0 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75   No locking occu
26200 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  rs in temporary 
26210 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
26220 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
26230 7c 7c 20 6e 6f 4c 6f 63 6b 20 29 3b 0a 0a 20 20  || noLock );..  
26240 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20  OSTRACE(("OPEN  
26250 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
26260 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
26270 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  pNew->h = h;.  p
26280 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  New->pVfs = pVfs
26290 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20  ;.  pNew->zPath 
262a0 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70  = zFilename;.  p
262b0 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d  New->ctrlFlags =
262c0 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
262d0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
262e0 69 6c 65 6e 61 6d 65 2c 20 22 70 73 6f 77 22 2c  ilename, "psow",
262f0 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
26300 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
26310 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
26320 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
26330 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  PSOW;.  }.  if( 
26340 6d 65 6d 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61  memcmp(pVfs->zNa
26350 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 2c 31  me,"unix-excl",1
26360 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  0)==0 ){.    pNe
26370 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
26380 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20  UNIXFILE_EXCL;. 
26390 20 7d 0a 20 20 69 66 28 20 69 73 52 65 61 64 4f   }.  if( isReadO
263a0 6e 6c 79 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  nly ){.    pNew-
263b0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
263c0 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  IXFILE_RDONLY;. 
263d0 20 7d 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72   }.  if( syncDir
263e0 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
263f0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
26400 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d  ILE_DIRSYNC;.  }
26410 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
26420 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76  .  pNew->pId = v
26430 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
26440 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
26450 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20  f( pNew->pId==0 
26460 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20  ){.    noLock = 
26470 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
26480 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
26490 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f  ndif..  if( noLo
264a0 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  ck ){.    pLocki
264b0 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63  ngStyle = &noloc
264c0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  kIoMethods;.  }e
264d0 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  lse{.    pLockin
264e0 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e  gStyle = (**(fin
264f0 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e  der_type*)pVfs->
26500 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e  pAppData)(zFilen
26510 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20  ame, pNew);.#if 
26520 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
26530 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
26540 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61  /* Cache zFilena
26550 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  me in the lockin
26560 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61  g context (AFP a
26570 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72  nd dotlock overr
26580 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ide) for.    ** 
26590 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61  proxyLock activa
265a0 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  tion is possible
265b0 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69   (remote proxy i
265c0 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61  s based on db na
265d0 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65  me).    ** zFile
265e0 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  name remains val
265f0 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73  id until file is
26600 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70   closed, to supp
26610 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ort */.    pNew-
26620 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
26630 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61  = (void*)zFilena
26640 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  me;.#endif.  }..
26650 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74    if( pLockingSt
26660 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d  yle == &posixIoM
26670 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e  ethods.#if defin
26680 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
26690 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
266a0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
266b0 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c   || pLockingStyl
266c0 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f  e == &nfsIoMetho
266d0 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  ds.#endif.  ){. 
266e0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
266f0 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
26700 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
26710 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
26720 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
26730 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26740 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
26750 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e 64 49  occured in findI
26760 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73  nodeInfo(), clos
26770 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
26780 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  iptor.      ** i
26790 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f  mmediately, befo
267a0 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  re releasing the
267b0 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64   mutex. findInod
267c0 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c  eInfo() may fail
267d0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f  .      ** in two
267e0 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20   scenarios:.    
267f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
26800 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73  (a) A call to fs
26810 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20  tat() failed..  
26820 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d      **   (b) A m
26830 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20  alloc failed..  
26840 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
26850 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79  Scenario (b) may
26860 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74   only occur if t
26870 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  he process is ho
26880 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20  lding no other. 
26890 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73       ** file des
268a0 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e  criptors open on
268b0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20   the same file. 
268c0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74  If there were ot
268d0 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  her file.      *
268e0 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e  * descriptors on
268f0 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e   this file, then
26900 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64   no malloc would
26910 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a   be required by.
26920 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f        ** findIno
26930 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69  deInfo(). If thi
26940 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69  s is the case, i
26950 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20  t is quite safe 
26960 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a  to close.      *
26970 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20  * handle h - as 
26980 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
26990 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c   that no posix l
269a0 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c  ocks will be rel
269b0 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  eased.      ** b
269c0 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20  y doing so..    
269d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
269e0 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61   scenario (a) ca
269f0 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74  used the error t
26a00 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e  hen things are n
26a10 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a  ot so safe. The.
26a20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69        ** implici
26a30 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72  t assumption her
26a40 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74  e is that if fst
26a50 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e  at() fails, thin
26a60 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20  gs are in.      
26a70 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70  ** such bad shap
26a80 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20  e that dropping 
26a90 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f  a lock or two do
26aa0 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63  esn't matter muc
26ab0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
26ac0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
26ad0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
26ae0 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  );.      h = -1;
26af0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
26b00 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
26b10 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
26b20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
26b30 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
26b40 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69  PPLE__).  else i
26b50 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
26b60 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
26b70 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20  s ){.    /* AFP 
26b80 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
26b90 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
26ba0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
26bb0 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
26bc0 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  the afpLockingCo
26bd0 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ntext..    */.  
26be0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
26bf0 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70  ext *pCtx;.    p
26c00 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
26c10 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c  ext = pCtx = sql
26c20 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
26c30 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
26c40 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
26c50 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26c60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
26c70 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42  lse{.      /* NB
26c80 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73  : zFilename exis
26c90 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76  ts and remains v
26ca0 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66  alid until the f
26cb0 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20  ile is closed.  
26cc0 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67      ** according
26cd0 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20   to requirement 
26ce0 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64  F11141.  So we d
26cf0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61  o not need to ma
26d00 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ke a.      ** co
26d10 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  py of the filena
26d20 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74  me. */.      pCt
26d30 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c  x->dbPath = zFil
26d40 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74  ename;.      pCt
26d50 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b  x->reserved = 0;
26d60 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65  .      srandomde
26d70 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45  v();.      unixE
26d80 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
26d90 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
26da0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
26db0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
26dc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26dd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
26de0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
26df0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
26e00 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  );.        robus
26e10 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
26e20 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
26e30 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
26e40 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65    }.      unixLe
26e50 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20  aveMutex();     
26e60 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65     .    }.  }.#e
26e70 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28  ndif..  else if(
26e80 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
26e90 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
26ea0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ods ){.    /* Do
26eb0 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73  tfile locking us
26ec0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
26ed0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
26ee0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
26ef0 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
26f00 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
26f10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
26f20 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
26f30 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
26f40 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
26f50 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  ename!=0 );.    
26f60 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74  nFilename = (int
26f70 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d  )strlen(zFilenam
26f80 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63  e) + 6;.    zLoc
26f90 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
26fa0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
26fb0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
26fc0 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
26fd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
26fe0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
26ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
27000 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
27010 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69  ilename, zLockFi
27020 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b  le, "%s" DOTLOCK
27030 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61  _SUFFIX, zFilena
27040 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
27050 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
27060 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
27070 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
27080 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20  ORKS.  else if( 
27090 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
270a0 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29   &semIoMethods )
270b0 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73  {.    /* Named s
270c0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
270d0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
270e0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
270f0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63  to be.    ** inc
27100 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d  luded in the sem
27110 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20  LockingContext. 
27120 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e     */.    unixEn
27130 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
27140 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
27150 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
27160 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
27170 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
27180 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64   && (pNew->pInod
27190 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29  e->pSem==NULL) )
271a0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
271b0 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
271c0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b  Inode->aSemName;
271d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
271e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
271f0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
27200 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25  E, zSemName, "/%
27210 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20  s.sem",.        
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
27230 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  New->pId->zCanon
27240 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  icalName);.     
27250 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e   for( n=1; zSemN
27260 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20  ame[n]; n++ ).  
27270 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61        if( zSemNa
27280 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65  me[n]=='/' ) zSe
27290 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a  mName[n] = '_';.
272a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
272b0 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f  de->pSem = sem_o
272c0 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f  pen(zSemName, O_
272d0 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b  CREAT, 0666, 1);
272e0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
272f0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d  >pInode->pSem ==
27300 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
27310 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27320 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
27330 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
27340 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
27350 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
27360 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
27370 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
27380 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61  if.  .  pNew->la
27390 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66  stErrno = 0;.#if
273a0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
273b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
273c0 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
273d0 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
273e0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
273f0 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  );.    h = -1;. 
27400 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c     osUnlink(zFil
27410 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65  ename);.    isDe
27420 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lete = 0;.  }.  
27430 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d  pNew->isDelete =
27440 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69   isDelete;.#endi
27450 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
27460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
27470 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
27480 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
27490 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65  LINE__);.  }else
274a0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74  {.    pNew->pMet
274b0 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74  hod = pLockingSt
274c0 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  yle;.    OpenCou
274d0 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20  nter(+1);.  }.  
274e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
274f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
27500 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
27510 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
27520 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
27530 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
27540 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
27550 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
27560 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
27570 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
27580 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
27590 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
275a0 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
275b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
275c0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
275d0 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
275e0 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
275f0 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
27600 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20  "/tmp",.     0  
27610 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
27620 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b  rminator */.  };
27630 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
27640 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
27650 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
27660 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20  ar *zDir = 0;.. 
27670 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c   azDirs[0] = sql
27680 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
27690 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  ory;.  if( !azDi
276a0 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31  rs[1] ) azDirs[1
276b0 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
276c0 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  IR");.  for(i=0;
276d0 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
276e0 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
276f0 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
27700 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20  [i++]){.    if( 
27710 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zDir==0 ) contin
27720 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74  ue;.    if( osSt
27730 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29  at(zDir, &buf) )
27740 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
27750 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
27760 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
27770 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41  nue;.    if( osA
27780 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20  ccess(zDir, 07) 
27790 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
277a0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
277b0 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zDir;.}../*.
277c0 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
277d0 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
277e0 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
277f0 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
27800 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
27810 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
27820 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
27830 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
27840 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
27850 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
27860 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27870 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
27880 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
27890 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
278a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
278b0 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
278c0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
278d0 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
278e0 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
278f0 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
27900 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
27910 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
27920 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
27930 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74   *zDir;..  /* It
27940 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
27950 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
27960 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
27970 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
27980 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
27990 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
279a0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
279b0 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
279c0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
279d0 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
279e0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
279f0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
27a00 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
27a10 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
27a20 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
27a30 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20  Dir==0 ) zDir = 
27a40 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ".";..  /* Check
27a50 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
27a60 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
27a70 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
27a80 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
27a90 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
27aa0 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
27ab0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
27ac0 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e  */.  if( (strlen
27ad0 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28  (zDir) + strlen(
27ae0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
27af0 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e  _PREFIX) + 17) >
27b00 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
27b10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
27b20 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
27b30 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
27b40 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
27b50 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  17, zBuf, "%s/"S
27b60 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
27b70 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
27b80 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
27b90 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
27ba0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
27bb0 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
27bc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
27bd0 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
27be0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
27bf0 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
27c00 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
27c10 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
27c20 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
27c30 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
27c40 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63  ;.  }while( osAc
27c50 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20  cess(zBuf,0)==0 
27c60 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
27c70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
27c80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
27c90 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
27ca0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
27cb0 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f  /*.** Routine to
27cc0 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69   transform a uni
27cd0 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f  xFile into a pro
27ce0 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46  xy-locking unixF
27cf0 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ile..** Implemen
27d00 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72  tation in the pr
27d10 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f  oxy-lock divisio
27d20 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75  n, but used by u
27d30 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20  nixOpen().** if 
27d40 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
27d50 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64  OXY_LOCKING is d
27d60 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
27d70 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
27d80 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
27d90 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68  xFile*, const ch
27da0 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ar*);.#endif../*
27db0 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
27dc0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
27dd0 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61  scriptor that wa
27de0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
27df0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
27e00 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
27e10 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   or master-journ
27e20 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66  al file) identif
27e30 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a  ied by pathname.
27e40 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51  ** zPath with SQ
27e50 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
27e60 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f  ags matching tho
27e70 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
27e80 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
27e90 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
27ea0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68  tion..**.** Such
27eb0 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
27ec0 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20  or may exist if 
27ed0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
27ee0 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64  ction was closed
27ef0 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f  .** but the asso
27f00 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63  ciated file desc
27f10 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74  riptor could not
27f20 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75   be closed becau
27f30 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  se some.** other
27f40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27f50 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
27f60 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e  e file is holdin
27f70 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a  g a file-lock..*
27f80 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65  * Refer to comme
27f90 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43  nts in the unixC
27fa0 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  lose() function 
27fb0 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20  and the lengthy 
27fc0 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72  comment.** descr
27fd0 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76  ibing "Posix Adv
27fe0 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61  isory Locking" a
27ff0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
28000 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a  his file for .**
28010 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73   further details
28020 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23  . Also, ticket #
28030 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  4018..**.** If a
28040 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64   suitable file d
28050 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75  escriptor is fou
28060 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72  nd, then it is r
28070 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a  eturned. If no.*
28080 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63  * such file desc
28090 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65  riptor is locate
280a0 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
280b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69  d..*/.static Uni
280c0 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52  xUnusedFd *findR
280d0 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20  eusableFd(const 
280e0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
280f0 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55   flags){.  UnixU
28100 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
28110 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e   = 0;..  /* Do n
28120 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e  ot search for an
28130 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
28140 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72  criptor on vxwor
28150 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a  ks. Not because.
28160 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75    ** vxworks wou
28170 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66  ld not benefit f
28180 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28  rom the change (
28190 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20  it might, we're 
281a0 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20  not sure),.  ** 
281b0 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77  but because no w
281c0 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73  ay to test it is
281d0 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
281e0 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74  able. It is bett
281f0 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  er .  ** not to 
28200 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78  risk breaking vx
28210 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f  works support fo
28220 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75  r the sake of su
28230 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20  ch an obscure . 
28240 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f   ** feature.  */
28250 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
28260 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
28270 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
28280 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
28290 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c  ts of stat() cal
282a0 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61  l */..  /* A sta
282b0 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69  t() call may fai
282c0 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65  l for various re
282d0 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68  asons. If this h
282e0 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20  appens, it is.  
282f0 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ** almost certai
28300 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29  n that an open()
28310 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d   call on the sam
28320 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f  e path will also
28330 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20   fail..  ** For 
28340 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20  this reason, if 
28350 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
28360 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61  in the stat() ca
28370 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20  ll here, it is. 
28380 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   ** ignored and 
28390 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  -1 is returned. 
283a0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
283b0 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  try to open a ne
283c0 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  w file.  ** desc
283d0 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61  riptor on the sa
283e0 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61  me path, fail, a
283f0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
28400 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20  or to SQLite..  
28410 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20  **.  ** Even if 
28420 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65  a subsequent ope
28430 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75  n() call does su
28440 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65  cceed, the conse
28450 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20  quences of.  ** 
28460 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f  not searching fo
28470 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66 69  r a resusable fi
28480 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
28490 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a  e not dire.  */.
284a0 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
284b0 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29  zPath, &sStat) )
284c0 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49  {.    unixInodeI
284d0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20  nfo *pInode;..  
284e0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
284f0 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d  ();.    pInode =
28500 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
28510 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
28520 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   (pInode->fileId
28530 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64  .dev!=sStat.st_d
28540 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ev.             
28550 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64          || pInod
28560 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73  e->fileId.ino!=s
28570 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a  Stat.st_ino) ){.
28580 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20         pInode = 
28590 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
285a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
285b0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69  ode ){.      Uni
285c0 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a  xUnusedFd **pp;.
285d0 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49        for(pp=&pI
285e0 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  node->pUnused; *
285f0 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
28600 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
28610 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
28620 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
28630 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
28640 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
28650 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
28660 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
28670 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
28680 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
28690 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
286a0 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
286b0 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
286c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
286d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
286e0 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20  d by unixOpen() 
286f0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
28700 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e   unix permission
28710 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e  s.** to create n
28720 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49  ew files with. I
28730 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
28740 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
28750 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
28760 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69   and a value sui
28770 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e  table for passin
28780 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  g as the third a
28790 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28  rgument to open(
287a0 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  2) is.** written
287b0 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61   to *pMode. If a
287c0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
287d0 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
287e0 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
287f0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
28800 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20  value of *pMode 
28810 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e  is not modified.
28820 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
28830 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
28840 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
28850 69 6c 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ile, it is alway
28860 73 20 63 72 65 61 74 65 64 20 77 69 74 68 0a 2a  s created with.*
28870 2a 20 74 68 65 20 6f 63 74 61 6c 20 70 65 72 6d  * the octal perm
28880 69 73 73 69 6f 6e 73 20 30 36 30 30 20 28 72 65  issions 0600 (re
28890 61 64 2f 77 72 69 74 61 62 6c 65 20 62 79 20 6f  ad/writable by o
288a0 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20 74  wner only). If t
288b0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 20  he file.** is a 
288c0 64 61 74 61 62 61 73 65 20 6f 72 20 6d 61 73 74  database or mast
288d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
288e0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 77   it is created w
288f0 69 74 68 20 74 68 65 20 70 65 72 6d 69 73 73 69  ith the permissi
28900 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c  ons .** mask SQL
28910 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
28920 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a  _PERMISSIONS..**
28930 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
28940 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
28950 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f  pened is a WAL o
28960 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  r regular journa
28970 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a  l file, then .**
28980 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71   this function q
28990 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d  ueries the file-
289a0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70  system for the p
289b0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
289c0 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
289d0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
289e0 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64  e and sets *pMod
289f0 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e  e to this value.
28a00 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f   Whenever .** po
28a10 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20  ssible, WAL and 
28a20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  journal files ar
28a30 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  e created using 
28a40 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
28a50 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20  ions .** as the 
28a60 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
28a70 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
28a80 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  If the SQLITE_EN
28a90 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f  ABLE_8_3_NAMES o
28aa0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
28ab0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72  , then the.** or
28ac0 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
28ad0 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20  is unavailable. 
28ae0 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69   But 8_3_NAMES i
28af0 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a  s only used for.
28b00 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65  ** FAT filesyste
28b10 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f  ms and permissio
28b20 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ns do not matter
28b30 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20   there, so just 
28b40 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  use.** the defau
28b50 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  lt permissions..
28b60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
28b70 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
28b80 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
28b90 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
28ba0 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66      /* Path of f
28bb0 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62  ile (possibly) b
28bc0 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a  eing created */.
28bd0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
28c00 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e  d as 4th argumen
28c10 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  t to xOpen() */.
28c20 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 20    mode_t *pMode 
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c40 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73    /* OUT: Permis
28c50 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69  sions to open fi
28c60 6c 65 20 77 69 74 68 20 2a 2f 0a 29 7b 0a 20 20  le with */.){.  
28c70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28c80 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
28c90 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
28ca0 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51 4c  /.  *pMode = SQL
28cb0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
28cc0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20  _PERMISSIONS;.  
28cd0 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
28ce0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
28cf0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
28d00 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68  URNAL) ){.    ch
28d10 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e  ar zDb[MAX_PATHN
28d20 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44  AME+1];     /* D
28d30 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74  atabase file pat
28d40 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62  h */.    int nDb
28d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28d60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28d70 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20   of valid bytes 
28d80 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74  in zDb */.    st
28d90 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
28da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
28db0 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20  utput of stat() 
28dc0 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
28dd0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74   */..    /* zPat
28de0 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61  h is a path to a
28df0 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20   WAL or journal 
28e00 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  file. The follow
28e10 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65  ing block derive
28e20 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74  s.    ** the pat
28e30 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61  h to the associa
28e40 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
28e50 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68  e from zPath. Th
28e60 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
28e70 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
28e80 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e  owing naming con
28e90 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a  ventions:.    **
28ea0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
28eb0 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22   to db>-journal"
28ec0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
28ed0 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20   to db>-wal".   
28ee0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
28ef0 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20  db>-journalNN". 
28f00 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
28f10 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20  o db>-walNN".   
28f20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65   **.    ** where
28f30 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c   NN is a decimal
28f40 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20   number. The NN 
28f50 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61  naming schemes a
28f60 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  re .    ** used 
28f70 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74  by the test_mult
28f80 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a  iplex.c module..
28f90 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d      */.    nDb =
28fa0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
28fb0 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69  (zPath) - 1; .#i
28fc0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
28fd0 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20  LE_8_3_NAMES.   
28fe0 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26   while( nDb>0 &&
28ff0 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28   sqlite3Isalnum(
29000 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44  zPath[nDb]) ) nD
29010 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62  b--;.    if( nDb
29020 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62  ==0 || zPath[nDb
29030 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20  ]!='-' ) return 
29040 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
29050 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74  .    while( zPat
29060 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20  h[nDb]!='-' ){. 
29070 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 62       assert( nDb
29080 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
29090 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d  rt( zPath[nDb]!=
290a0 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44  '\n' );.      nD
290b0 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  b--;.    }.#endi
290c0 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  f.    memcpy(zDb
290d0 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20  , zPath, nDb);. 
290e0 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c     zDb[nDb] = '\
290f0 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d  0';..    if( 0==
29100 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74  osStat(zDb, &sSt
29110 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d  at) ){.      *pM
29120 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d  ode = sStat.st_m
29130 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20  ode & 0777;.    
29140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
29150 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  = SQLITE_IOERR_F
29160 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  STAT;.    }.  }e
29170 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
29180 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
29190 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20  TEONCLOSE ){.   
291a0 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a   *pMode = 0600;.
291b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
291c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
291d0 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a  he file zPath..*
291e0 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79  * .** Previously
291f0 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20  , the SQLite OS 
29200 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65  layer used three
29210 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c   functions in pl
29220 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f  ace of this.** o
29230 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ne:.**.**     sq
29240 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
29250 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73  rite();.**     s
29260 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
29270 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73  Only();.**     s
29280 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
29290 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54  usive();.**.** T
292a0 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65  hese calls corre
292b0 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c  spond to the fol
292c0 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
292d0 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  ons of flags:.**
292e0 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74  .**     ReadWrit
292f0 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44  e() ->     (READ
29300 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a  WRITE | CREATE).
29310 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28  **     ReadOnly(
29320 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f  )  ->     (READO
29330 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65  NLY) .**     Ope
29340 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20  nExclusive() -> 
29350 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
29360 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29  ATE | EXCLUSIVE)
29370 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f  .**.** The old O
29380 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61  penExclusive() a
29390 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61  ccepted a boolea
293a0 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65  n argument - "de
293b0 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72  lFlag". If.** tr
293c0 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73  ue, the file was
293d0 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62   configured to b
293e0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
293f0 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
29400 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  .** file handle 
29410 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65  closed. To achie
29420 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65  ve the same effe
29430 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65  ct using this ne
29440 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  w .** interface,
29450 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f   add the DELETEO
29460 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74  NCLOSE flag to t
29470 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61  hose specified a
29480 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65  bove for .** Ope
29490 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f  nExclusive()..*/
294a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
294b0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
294c0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
294d0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
294e0 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
294f0 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68  s the xOpen meth
29500 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
29510 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
29520 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65       /* Pathname
29530 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f   of file to be o
29540 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
29550 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
29560 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
29570 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
29580 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a  o be filled in *
29590 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
295a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295b0 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20   /* Input flags 
295c0 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f  to control the o
295d0 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  pening */.  int 
295e0 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
295f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
29600 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  ut flags returne
29610 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65  d to SQLite core
29620 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
29630 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
29640 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
29650 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
29660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29670 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65  le descriptor re
29680 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29  turned by open()
29690 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c   */.  int openFl
296a0 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
296b0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
296c0 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20   pass to open() 
296d0 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
296e0 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
296f0 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
29700 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
29710 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20   int noLock;    
29720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29730 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
29740 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
29750 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
29760 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
29770 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
29780 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
29790 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
297a0 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
297b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
297c0 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
297d0 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
297e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
297f0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
29800 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
29810 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
29820 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
29830 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
29840 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
29850 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
29860 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
29870 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
29880 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
29890 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
298a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
298b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
298c0 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f  .  int isAutoPro
298d0 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  xy  = (flags & S
298e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
298f0 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ROXY);.#endif.#i
29900 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
29910 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
29920 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
29930 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61  YLE.  struct sta
29940 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64  tfs fsInfo;.#end
29950 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61  if..  /* If crea
29960 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72  ting a master or
29970 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e   main-file journ
29980 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  al, this functio
29990 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a  n will open.  **
299a0 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74   a file-descript
299b0 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74  or on the direct
299c0 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72  ory too. The fir
299d0 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63  st time unixSync
299e0 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  ().  ** is calle
299f0 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  d the directory 
29a00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
29a10 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65  will be fsync()e
29a20 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a  d and close()d..
29a30 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44    */.  int syncD
29a40 69 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 26  ir = (isCreate &
29a50 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70  & (.        eTyp
29a60 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
29a70 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
29a80 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
29a90 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
29aa0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
29ab0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29ac0 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20  EN_WAL.  ));..  
29ad0 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
29ae0 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
29af0 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
29b00 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
29b10 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
29b20 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
29b30 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
29b40 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
29b50 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
29b60 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
29b70 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
29b80 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
29b90 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a  zName = zPath;..
29ba0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
29bb0 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
29bc0 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
29bd0 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
29be0 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
29bf0 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
29c00 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
29c10 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
29c20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
29c30 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
29c40 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
29c50 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
29c60 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
29c70 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
29c80 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
29c90 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
29ca0 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
29cb0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
29cc0 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
29cd0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
29ce0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
29cf0 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
29d00 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
29d10 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
29d20 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
29d30 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
29d40 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
29d50 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
29d60 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
29d70 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
29d80 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
29d90 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
29da0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
29db0 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
29dc0 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64  al, WAL file and
29dd0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
29de0 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20  are never .  ** 
29df0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
29e00 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74  leted. Nor are t
29e10 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61  hey ever tempora
29e20 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ry files.  */.  
29e30 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
29e40 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
29e50 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
29e60 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
29e70 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
29e80 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
29e90 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
29ea0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
29eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
29ec0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
29ed0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
29ee0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
29ef0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
29f00 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
29f10 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
29f20 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e!=SQLITE_OPEN_W
29f30 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
29f40 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
29f50 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
29f60 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
29f70 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
29f80 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
29f90 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
29fa0 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
29fb0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
29fc0 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
29fd0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
29fe0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
29ff0 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
2a000 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
2a010 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
2a020 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2a030 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
2a040 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2a050 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
2a060 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
2a070 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2a080 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
2a090 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  B || eType==SQLI
2a0a0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b  TE_OPEN_WAL.  );
2a0b0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
2a0c0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
2a0d0 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  ));..  if( eType
2a0e0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2a0f0 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69  IN_DB ){.    Uni
2a100 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2a110 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  ed;.    pUnused 
2a120 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
2a130 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
2a140 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2a150 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55  ){.      fd = pU
2a160 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d  nused->fd;.    }
2a170 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75  else{.      pUnu
2a180 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
2a190 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e  lloc(sizeof(*pUn
2a1a0 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
2a1b0 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
2a1c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2a1d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2a1e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2a1f0 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
2a200 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  d;.  }else if( !
2a210 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  zName ){.    /* 
2a220 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c  If zName is NULL
2a230 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
2a240 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20  r is requesting 
2a250 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a  a temp file. */.
2a260 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c      assert(isDel
2a270 65 74 65 20 26 26 20 21 73 79 6e 63 44 69 72 29  ete && !syncDir)
2a280 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47  ;.    rc = unixG
2a290 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50  etTempname(MAX_P
2a2a0 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e  ATHNAME+1, zTmpn
2a2b0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
2a2c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a2d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2a2e0 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
2a2f0 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a  = zTmpname;.  }.
2a300 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
2a310 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2a320 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2a330 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58   passed to POSIX
2a340 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f   function.  ** o
2a350 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73  pen(). These mus
2a360 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20  t be calculated 
2a370 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69  even if open() i
2a380 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73  s not called, as
2a390 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  .  ** they may b
2a3a0 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  e stored as part
2a3b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
2a3c0 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20  dle and used by 
2a3d0 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68  the .  ** 'conch
2a3e0 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66   file' locking f
2a3f0 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f  unctions later o
2a400 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52  n.  */.  if( isR
2a410 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46  eadonly )  openF
2a420 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
2a430 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ;.  if( isReadWr
2a440 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ite ) openFlags 
2a450 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28  |= O_RDWR;.  if(
2a460 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f   isCreate )    o
2a470 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52  penFlags |= O_CR
2a480 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
2a490 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61  lusive ) openFla
2a4a0 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f  gs |= (O_EXCL|O_
2a4b0 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65  NOFOLLOW);.  ope
2a4c0 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  nFlags |= (O_LAR
2a4d0 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
2a4e0 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  ;..  if( fd<0 ){
2a4f0 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e  .    mode_t open
2a500 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
2a510 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e     /* Permission
2a520 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65  s to create file
2a530 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 72 63 20   with */.    rc 
2a540 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65  = findCreateFile
2a550 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  Mode(zName, flag
2a560 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  s, &openMode);. 
2a570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2a590 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65  sert( !p->pUnuse
2a5a0 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
2a5b0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
2a5c0 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79  _OPEN_WAL || eTy
2a5d0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2a5e0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
2a5f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2a600 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20  .    }.    fd = 
2a610 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
2a620 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
2a630 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54  enMode);.    OST
2a640 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25  RACE(("OPENX   %
2a650 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66  -3d %s 0%o\n", f
2a660 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  d, zName, openFl
2a670 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66  ags));.    if( f
2a680 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49  d<0 && errno!=EI
2a690 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
2a6a0 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
2a6b0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
2a6c0 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74  Failed to open t
2a6d0 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  he file for read
2a6e0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
2a6f0 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f  ry read-only. */
2a700 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20  .      flags &= 
2a710 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
2a720 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
2a730 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
2a740 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20     openFlags &= 
2a750 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  ~(O_RDWR|O_CREAT
2a760 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  );.      flags |
2a770 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2a780 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70  ADONLY;.      op
2a790 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
2a7a0 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61  NLY;.      isRea
2a7b0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
2a7c0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2a7d0 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
2a7e0 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
2a7f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c     }.    if( fd<
2a800 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2a810 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2a820 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2a830 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65  T, "open", zName
2a840 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  );.      goto op
2a850 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2a860 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
2a870 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20   fd>=0 );.  if( 
2a880 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
2a890 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c   *pOutFlags = fl
2a8a0 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
2a8b0 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  p->pUnused ){.  
2a8c0 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64    p->pUnused->fd
2a8d0 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55   = fd;.    p->pU
2a8e0 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66  nused->flags = f
2a8f0 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
2a900 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
2a910 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
2a920 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23  zPath = zName;.#
2a930 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e  else.    osUnlin
2a940 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  k(zName);.#endif
2a950 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
2a960 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a970 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20  TYLE.  else{.   
2a980 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20   p->openFlags = 
2a990 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23  openFlags;.  }.#
2a9a0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 46 44  endif..#ifdef FD
2a9b0 5f 43 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63 6e  _CLOEXEC.  osFcn
2a9c0 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
2a9d0 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
2a9e0 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
2a9f0 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  EXEC);.#endif.. 
2aa00 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21   noLock = eType!
2aa10 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2aa20 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65  N_DB;..  .#if de
2aa30 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2aa40 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
2aa50 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2aa60 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64    if( fstatfs(fd
2aa70 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
2aa80 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
2aa90 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74  le*)pFile)->last
2aaa0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
2aab0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2aac0 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p, fd, __LINE__)
2aad0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2aae0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
2aaf0 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d  ;.  }.  if (0 ==
2ab00 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22   strncmp("msdos"
2ab10 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  , fsInfo.f_fstyp
2ab20 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20  ename, 5)) {.   
2ab30 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
2ab40 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20  le)->fsFlags |= 
2ab50 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
2ab60 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e  S_MSDOS;.  }.#en
2ab70 64 69 66 0a 20 20 0a 23 69 66 20 53 51 4c 49 54  dif.  .#if SQLIT
2ab80 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2ab90 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54  _STYLE.#if SQLIT
2aba0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2abb0 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50  OCKING.  isAutoP
2abc0 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  roxy = 1;.#endif
2abd0 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f  .  if( isAutoPro
2abe0 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55  xy && (zPath!=NU
2abf0 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29  LL) && (!noLock)
2ac00 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20   && pVfs->xOpen 
2ac10 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76  ){.    char *env
2ac20 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22  force = getenv("
2ac30 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
2ac40 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20  XY_LOCKING");.  
2ac50 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d    int useProxy =
2ac60 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49   0;..    /* SQLI
2ac70 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
2ac80 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20  OCKING==1 means 
2ac90 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65  force always use
2aca0 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20   proxy, 0 means 
2acb0 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73  .    ** never us
2acc0 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65  e proxy, NULL me
2acd0 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f  ans use proxy fo
2ace0 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  r non-local file
2acf0 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20  s only.  */.    
2ad00 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55  if( envforce!=NU
2ad10 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50  LL ){.      useP
2ad20 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66  roxy = atoi(envf
2ad30 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c  orce)>0;.    }el
2ad40 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  se{.      if( st
2ad50 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49  atfs(zPath, &fsI
2ad60 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
2ad70 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
2ad80 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64  ry, the close(fd
2ad90 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70  ) call is sub-op
2ada0 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69  timal. If the fi
2adb0 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20  le opened.      
2adc0 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20    ** with fd is 
2add0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
2ade0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f   and there are o
2adf0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
2ae00 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
2ae10 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
2ae20 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
2ae30 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72   holding advisor
2ae40 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20  y locks on it,. 
2ae50 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
2ae60 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65  he call to close
2ae70 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74  () will cancel t
2ae80 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70  hose locks. In p
2ae90 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20  ractice,.       
2aea0 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69   ** we're assumi
2aeb0 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29  ng that statfs()
2aec0 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65   doesn't fail ve
2aed0 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61  ry often. At lea
2aee0 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  st.        ** no
2aef0 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69  t while other fi
2af00 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2af10 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d  pened by the sam
2af20 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20  e process on.   
2af30 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
2af40 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e   file are workin
2af50 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  g.  */.        p
2af60 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2af70 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  rno;.        rob
2af80 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
2af90 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2afa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2afb0 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
2afc0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
2afd0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
2afe0 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  }.      useProxy
2aff0 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c   = !(fsInfo.f_fl
2b000 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a  ags&MNT_LOCAL);.
2b010 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
2b020 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  eProxy ){.      
2b030 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
2b040 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 73 79  ile(pVfs, fd, sy
2b050 6e 63 44 69 72 2c 20 70 46 69 6c 65 2c 20 7a 50  ncDir, pFile, zP
2b060 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20  ath, noLock,.   
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b080 20 20 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c         isDelete,
2b090 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20   isReadonly);.  
2b0a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b0b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b0c0 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73   rc = proxyTrans
2b0d0 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e  formUnixFile((un
2b0e0 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22  ixFile*)pFile, "
2b0f0 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20  :auto:");.      
2b100 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b110 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2b120 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73   /* Use unixClos
2b130 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  e to clean up th
2b140 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65  e resources adde
2b150 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46  d in fillInUnixF
2b160 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ile .          *
2b170 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20  * and clear all 
2b180 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20  the structure's 
2b190 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65  references.  Spe
2b1a0 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20  cifically, .    
2b1b0 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e        ** pFile->
2b1c0 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65  pMethods will be
2b1d0 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33   NULL so sqlite3
2b1e0 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20  OsClose will be 
2b1f0 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20  a no-op .       
2b200 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2b210 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29  unixClose(pFile)
2b220 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2b230 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2b240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
2b250 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
2b260 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  d;.    }.  }.#en
2b270 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  dif.  .  rc = fi
2b280 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
2b290 73 2c 20 66 64 2c 20 73 79 6e 63 44 69 72 2c 20  s, fd, syncDir, 
2b2a0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
2b2b0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 44 65              isDe
2b2d0 6c 65 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79  lete, isReadonly
2b2e0 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  );.open_finished
2b2f0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
2b300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2b310 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e  ite3_free(p->pUn
2b320 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  used);.  }.  ret
2b330 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2b340 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * Delete the fil
2b350 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74  e at zPath. If t
2b360 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d  he dirSync argum
2b370 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79  ent is true, fsy
2b380 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65  nc().** the dire
2b390 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
2b3a0 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ting the file..*
2b3b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2b3c0 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  xDelete(.  sqlit
2b3d0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2b3e0 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74       /* VFS cont
2b3f0 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74  aining this as t
2b400 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f  he xDelete metho
2b410 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2b420 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
2b430 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
2b440 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a   to be deleted *
2b450 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20  /.  int dirSync 
2b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b470 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28   If true, fsync(
2b480 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  ) directory afte
2b490 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20  r deleting file 
2b4a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
2b4b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e   SQLITE_OK;.  UN
2b4c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2b4d0 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c  otUsed);.  Simul
2b4e0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
2b4f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
2b500 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73  ELETE);.  if( os
2b510 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28  Unlink(zPath)==(
2b520 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e  -1) && errno!=EN
2b530 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75  OENT ){.    retu
2b540 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
2b550 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2b560 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a  ETE, "unlink", z
2b570 50 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Path);.  }.#ifnd
2b580 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2b590 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20  E_DIRSYNC.  if( 
2b5a0 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  dirSync ){.    i
2b5b0 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20  nt fd;.    rc = 
2b5c0 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
2b5d0 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20  zPath, &fd);.   
2b5e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b5f0 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  OK ){.#if OS_VXW
2b600 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66  ORKS.      if( f
2b610 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23  sync(fd)==-1 ).#
2b620 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66  else.      if( f
2b630 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69  sync(fd) ).#endi
2b640 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
2b650 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
2b660 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
2b670 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79  _DIR_FSYNC, "fsy
2b680 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  nc", zPath);.   
2b690 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73     }.      robus
2b6a0 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f  t_close(0, fd, _
2b6b0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65  _LINE__);.    }e
2b6c0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2b6d0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
2b6e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b6f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  _OK;.    }.  }.#
2b700 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
2b710 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
2b720 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   the existance o
2b730 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d  f or access perm
2b740 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20  issions of file 
2b750 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65  zPath. The.** te
2b760 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70  st performed dep
2b770 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
2b780 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  e of flags:.**.*
2b790 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
2b7a0 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75  ESS_EXISTS: Retu
2b7b0 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
2b7c0 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53   exists.**     S
2b7d0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2b7e0 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31  DWRITE: Return 1
2b7f0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
2b800 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c  read and writabl
2b810 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  e..**     SQLITE
2b820 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59  _ACCESS_READONLY
2b830 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
2b840 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62  e file is readab
2b850 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  le..**.** Otherw
2b860 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ise return 0..*/
2b870 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2b880 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
2b890 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2b8a0 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e    /* The VFS con
2b8b0 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63  taining this xAc
2b8c0 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  cess method */. 
2b8d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2b8e0 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68  th,      /* Path
2b8f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
2b900 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  examine */.  int
2b910 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2b920 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20       /* What do 
2b930 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e  we want to learn
2b940 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68   about the zPath
2b950 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   file? */.  int 
2b960 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
2b970 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
2b980 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65  ult boolean here
2b990 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f   */.){.  int amo
2b9a0 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44  de = 0;.  UNUSED
2b9b0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2b9c0 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
2b9d0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2b9e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
2b9f0 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28  SS; );.  switch(
2ba00 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
2ba10 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
2ba20 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61  _EXISTS:.      a
2ba30 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20  mode = F_OK;.   
2ba40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2ba50 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
2ba60 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
2ba70 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52    amode = W_OK|R
2ba80 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
2ba90 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2baa0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
2bab0 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f       amode = R_O
2bac0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
2bad0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
2bae0 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
2baf0 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
2bb00 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
2bb10 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73  esOut = (osAcces
2bb20 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d  s(zPath, amode)=
2bb30 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  =0);.  if( flags
2bb40 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
2bb50 45 58 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f  EXISTS && *pResO
2bb60 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ut ){.    struct
2bb70 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69   stat buf;.    i
2bb80 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  f( 0==osStat(zPa
2bb90 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66  th, &buf) && buf
2bba0 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20  .st_size==0 ){. 
2bbb0 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20       *pResOut = 
2bbc0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2bbd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bbe0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  .}.../*.** Turn 
2bbf0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
2bc00 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
2bc10 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65  pathname. The re
2bc20 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69  lative path.** i
2bc30 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75  s stored as a nu
2bc40 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
2bc50 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65  ing in the buffe
2bc60 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a  r pointed to by.
2bc70 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a  ** zPath. .**.**
2bc80 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20   zOut points to 
2bc90 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
2bca0 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  east sqlite3_vfs
2bcb0 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65  .mxPathname byte
2bcc0 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63  s .** (in this c
2bcd0 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d  ase, MAX_PATHNAM
2bce0 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75  E bytes). The fu
2bcf0 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74  ll-path is writt
2bd00 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75  en to.** this bu
2bd10 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75  ffer before retu
2bd20 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
2bd30 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74   int unixFullPat
2bd40 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
2bd50 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2bd60 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2bd70 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
2bd80 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2bd90 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2bda0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
2bdb0 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
2bdc0 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74  th */.  int nOut
2bdd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bde0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2bdf0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
2be00 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
2be10 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20  r *zOut         
2be20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2be30 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
2be40 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  {..  /* It's odd
2be50 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
2be60 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
2be70 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
2be80 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
2be90 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
2bea0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
2beb0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
2bec0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
2bed0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
2bee0 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
2bef0 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
2bf00 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
2bf10 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
2bf20 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
2bf30 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
2bf40 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
2bf50 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2bf60 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2bf70 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  R );..  assert( 
2bf80 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2bf90 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29  ==MAX_PATHNAME )
2bfa0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2bfb0 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a  ETER(pVfs);..  z
2bfc0 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c  Out[nOut-1] = '\
2bfd0 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b  0';.  if( zPath[
2bfe0 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73  0]=='/' ){.    s
2bff0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2c000 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22  nOut, zOut, "%s"
2c010 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  , zPath);.  }els
2c020 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b  e{.    int nCwd;
2c030 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77  .    if( osGetcw
2c040 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d  d(zOut, nOut-1)=
2c050 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2c060 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
2c070 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2c080 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20  BKPT, "getcwd", 
2c090 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
2c0a0 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74    nCwd = (int)st
2c0b0 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20  rlen(zOut);.    
2c0c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2c0d0 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75  (nOut-nCwd, &zOu
2c0e0 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20  t[nCwd], "/%s", 
2c0f0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65  zPath);.  }.  re
2c100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c110 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
2c120 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
2c130 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
2c140 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
2c150 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
2c160 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
2c170 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
2c180 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
2c190 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
2c1a0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
2c1b0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
2c1c0 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
2c1d0 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
2c1e0 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
2c1f0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
2c200 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2c210 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
2c220 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2c230 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
2c240 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
2c250 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
2c260 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
2c270 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
2c280 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
2c290 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
2c2a0 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
2c2b0 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
2c2c0 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
2c2d0 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
2c2e0 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
2c2f0 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
2c300 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
2c310 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
2c320 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
2c330 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
2c340 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
2c350 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
2c360 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
2c370 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
2c380 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
2c390 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
2c3a0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2c3b0 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
2c3c0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
2c3d0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2c3e0 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  ufOut){.  const 
2c3f0 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
2c400 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2c410 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
2c420 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
2c430 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
2c440 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
2c450 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2c460 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
2c470 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
2c480 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
2c490 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
2c4a0 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
2c4b0 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
2c4c0 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
2c4d0 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
2c4e0 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
2c4f0 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
2c500 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
2c510 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
2c520 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
2c530 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
2c540 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
2c550 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
2c560 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
2c570 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
2c580 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
2c590 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
2c5a0 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
2c5b0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2c5c0 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
2c5d0 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
2c5e0 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
2c5f0 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
2c600 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
2c610 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
2c620 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
2c630 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
2c640 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
2c650 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
2c660 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
2c670 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
2c680 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2c690 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
2c6a0 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
2c6b0 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
2c6c0 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
2c6d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
2c6e0 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
2c6f0 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
2c700 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
2c710 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
2c720 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
2c730 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
2c740 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
2c750 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
2c760 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
2c770 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
2c780 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
2c790 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
2c7a0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
2c7b0 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
2c7c0 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
2c7d0 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
2c7e0 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
2c7f0 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
2c800 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
2c810 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
2c820 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
2c830 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
2c840 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
2c850 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
2c860 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
2c870 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2c880 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
2c890 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
2c8a0 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
2c8b0 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
2c8c0 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
2c8d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
2c8e0 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
2c8f0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2c900 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
2c910 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2c920 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
2c930 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
2c940 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
2c950 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
2c960 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
2c970 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
2c980 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
2c990 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
2c9a0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
2c9b0 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
2c9c0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
2c9d0 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
2c9e0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
2c9f0 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
2ca00 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
2ca10 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
2ca20 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
2ca30 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
2ca40 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2ca50 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
2ca60 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2ca70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2ca80 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
2ca90 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
2caa0 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
2cab0 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
2cac0 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
2cad0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
2cae0 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
2caf0 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
2cb00 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
2cb10 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
2cb20 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
2cb30 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
2cb40 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
2cb50 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
2cb60 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
2cb70 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
2cb80 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
2cb90 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
2cba0 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
2cbb0 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
2cbc0 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
2cbd0 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
2cbe0 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
2cbf0 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
2cc00 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
2cc10 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
2cc20 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
2cc30 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
2cc40 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
2cc50 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
2cc60 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
2cc70 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
2cc80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
2cc90 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
2cca0 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
2ccb0 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
2ccc0 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
2ccd0 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
2cce0 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
2ccf0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
2cd00 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
2cd10 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
2cd20 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
2cd30 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
2cd40 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66  f, 0, nBuf);.#if
2cd50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2cd60 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69  _TEST).  {.    i
2cd70 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20  nt pid, fd;.    
2cd80 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2cd90 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c  ("/dev/urandom",
2cda0 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20   O_RDONLY, 0);. 
2cdb0 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
2cdc0 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20       time_t t;. 
2cdd0 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20       time(&t);. 
2cde0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
2cdf0 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29  , &t, sizeof(t))
2ce00 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65  ;.      pid = ge
2ce10 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65  tpid();.      me
2ce20 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f  mcpy(&zBuf[sizeo
2ce30 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a  f(t)], &pid, siz
2ce40 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20  eof(pid));.     
2ce50 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
2ce60 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d  t)+sizeof(pid)<=
2ce70 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a  (size_t)nBuf );.
2ce80 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a        nBuf = siz
2ce90 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28  eof(t) + sizeof(
2cea0 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pid);.    }else{
2ceb0 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42 75 66 20  .      do{ nBuf 
2cec0 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75  = osRead(fd, zBu
2ced0 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65  f, nBuf); }while
2cee0 28 20 6e 42 75 66 3c 30 20 26 26 20 65 72 72 6e  ( nBuf<0 && errn
2cef0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
2cf00 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
2cf10 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2cf20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2cf30 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b  f.  return nBuf;
2cf40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
2cf50 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
2cf60 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
2cf70 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
2cf80 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72  slept..** The ar
2cf90 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75  gument is the nu
2cfa0 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
2cfb0 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20  onds we want to 
2cfc0 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65  sleep..** The re
2cfd0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
2cfe0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
2cff0 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65  oseconds of slee
2d000 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  p actually.** re
2d010 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
2d020 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
2d030 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20  ating system, a 
2d040 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20  number which.** 
2d050 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72  might be greater
2d060 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2d070 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  o the argument, 
2d080 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20  but not less.** 
2d090 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  than the argumen
2d0a0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2d0b0 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74   unixSleep(sqlit
2d0c0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2d0d0 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
2d0e0 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  s){.#if OS_VXWOR
2d0f0 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
2d100 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74  spec sp;..  sp.t
2d110 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63  v_sec = microsec
2d120 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a  onds / 1000000;.
2d130 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28    sp.tv_nsec = (
2d140 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31  microseconds % 1
2d150 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a  000000) * 1000;.
2d160 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c    nanosleep(&sp,
2d170 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44   NULL);.  UNUSED
2d180 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2d190 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
2d1a0 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69  croseconds;.#eli
2d1b0 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
2d1c0 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
2d1d0 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
2d1e0 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20  icroseconds);.  
2d1f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2d200 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2d210 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
2d220 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65  ;.#else.  int se
2d230 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65  conds = (microse
2d240 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30  conds+999999)/10
2d250 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73  00000;.  sleep(s
2d260 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
2d270 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2d280 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  sed);.  return s
2d290 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a  econds*1000000;.
2d2a0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
2d2b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
2d2c0 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
2d2d0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
2d2e0 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
2d2f0 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
2d300 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
2d310 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
2d320 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
2d330 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
2d340 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
2d350 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
2d360 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
2d370 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
2d380 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2d390 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
2d3a0 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
2d3b0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2d3c0 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
2d3d0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
2d3e0 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
2d3f0 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
2d400 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
2d410 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
2d420 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
2d430 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
2d440 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
2d450 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
2d460 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
2d470 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
2d480 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
2d490 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
2d4a0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
2d4b0 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
2d4c0 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
2d4d0 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
2d4e0 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
2d4f0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
2d500 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
2d510 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
2d520 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
2d530 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
2d540 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  _OK.  Return SQL
2d550 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65  ITE_ERROR if the
2d560 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a   time and date .
2d570 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
2d580 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2d590 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
2d5a0 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
2d5b0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c  fs *NotUsed, sql
2d5c0 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
2d5d0 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  w){.  static con
2d5e0 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
2d5f0 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
2d600 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
2d610 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20  nt64)8640000;.  
2d620 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d630 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  OK;.#if defined(
2d640 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d  NO_GETTOD).  tim
2d650 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
2d660 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28  );.  *piNow = ((
2d670 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29  sqlite3_int64)t)
2d680 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63  *1000 + unixEpoc
2d690 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f  h;.#elif OS_VXWO
2d6a0 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
2d6b0 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c  espec sNow;.  cl
2d6c0 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43  ock_gettime(CLOC
2d6d0 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f  K_REALTIME, &sNo
2d6e0 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75  w);.  *piNow = u
2d6f0 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
2d700 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
2d710 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
2d720 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30  w.tv_nsec/100000
2d730 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  0;.#else.  struc
2d740 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a  t timeval sNow;.
2d750 20 20 69 66 28 20 67 65 74 74 69 6d 65 6f 66 64    if( gettimeofd
2d760 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20  ay(&sNow, 0)==0 
2d770 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2d780 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
2d790 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2d7a0 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
2d7b0 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b  ow.tv_usec/1000;
2d7c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2d7d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2d7e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
2d7f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2d800 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
2d810 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
2d820 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
2d830 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
2d840 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2d850 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
2d860 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
2d870 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2d880 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
2d890 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
2d8a0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
2d8b0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
2d8c0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
2d8d0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
2d8e0 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
2d8f0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
2d900 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
2d910 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
2d920 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
2d930 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
2d940 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
2d950 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
2d960 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2d970 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
2d980 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2d990 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
2d9a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
2d9b0 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 i = 0;.  int r
2d9c0 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
2d9d0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2d9e0 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65    rc = unixCurre
2d9f0 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26  ntTimeInt64(0, &
2da00 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69  i);.  *prNow = i
2da10 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72  /86400000.0;.  r
2da20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2da30 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
2da40 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
2da50 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
2da60 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
2da70 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
2da80 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
2da90 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
2daa0 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
2dab0 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
2dac0 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
2dad0 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
2dae0 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
2daf0 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
2db00 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
2db10 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
2db20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2db30 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
2db40 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
2db50 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
2db60 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
2db70 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
2db80 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
2db90 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
2dba0 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
2dbb0 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
2dbc0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2dbd0 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
2dbe0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2dbf0 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
2dc00 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2dc10 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
2dc20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../*.********
2dc30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc40 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
2dc50 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
2dc60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc70 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2dc80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dcb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dcc0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
2dcd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dcf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dd00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dd10 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2dd20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dd30 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
2dd40 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
2dd50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dd60 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
2dd70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2dd80 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
2dd90 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
2dda0 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
2ddb0 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
2ddc0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
2ddd0 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
2dde0 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
2ddf0 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
2de00 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
2de10 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
2de20 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
2de30 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
2de40 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
2de50 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
2de60 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
2de70 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
2de80 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
2de90 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
2dea0 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
2deb0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
2dec0 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
2ded0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
2dee0 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
2def0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
2df00 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
2df10 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
2df20 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
2df30 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
2df40 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
2df50 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
2df60 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
2df70 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
2df80 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
2df90 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
2dfa0 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
2dfb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2dfc0 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
2dfd0 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
2dfe0 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
2dff0 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
2e000 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
2e010 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
2e020 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
2e030 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
2e040 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
2e050 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
2e060 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
2e070 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
2e080 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
2e090 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
2e0a0 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
2e0b0 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
2e0c0 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
2e0d0 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
2e0e0 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
2e0f0 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
2e100 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
2e110 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
2e120 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
2e130 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
2e140 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
2e150 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
2e160 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
2e170 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
2e180 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
2e190 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
2e1a0 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
2e1b0 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
2e1c0 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
2e1d0 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
2e1e0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
2e1f0 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
2e200 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
2e210 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
2e220 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
2e230 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
2e240 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
2e250 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20  000..   ..**    
2e260 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
2e270 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
2e280 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
2e290 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
2e2a0 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
2e2b0 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
2e2c0 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
2e2d0 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
2e2e0 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
2e2f0 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
2e300 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
2e310 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
2e320 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
2e330 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
2e340 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
2e350 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
2e360 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
2e370 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
2e380 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
2e390 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
2e3a0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
2e3b0 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
2e3c0 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
2e3d0 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
2e3e0 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
2e3f0 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
2e400 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
2e410 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
2e420 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
2e430 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
2e440 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
2e450 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
2e460 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
2e470 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
2e480 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
2e490 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
2e4a0 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
2e4b0 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
2e4c0 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
2e4d0 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
2e4e0 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
2e4f0 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
2e500 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
2e510 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
2e520 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
2e530 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
2e540 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
2e550 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
2e560 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
2e570 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
2e580 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
2e590 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
2e5a0 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
2e5b0 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
2e5c0 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
2e5d0 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
2e5e0 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
2e5f0 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
2e600 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
2e610 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
2e620 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
2e630 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
2e640 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
2e650 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
2e660 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
2e670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
2e680 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
2e690 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
2e6a0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
2e6b0 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  me, SQLITE_SET_L
2e6c0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
2e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6e0 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61         <proxy_pa
2e6f0 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b  th> | ":auto:");
2e700 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
2e710 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
2e720 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54  name, SQLITE_GET
2e730 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
2e740 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a  &<proxy_path>);.
2e750 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61  **.**.** SQL pra
2e760 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47  gmas.**.**  PRAG
2e770 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
2e780 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70  ck_proxy_file=<p
2e790 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75  roxy_path> | :au
2e7a0 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  to:.**  PRAGMA [
2e7b0 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
2e7c0 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  roxy_file.**.** 
2e7d0 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74  Specifying ":aut
2e7e0 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69  o:" means that i
2e7f0 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  f there is a con
2e800 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d  ch file with a m
2e810 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20  atching.** host 
2e820 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72  ID in it, the pr
2e830 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20  oxy path in the 
2e840 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
2e850 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69  be used, otherwi
2e860 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61  se.** a proxy pa
2e870 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  th based on the 
2e880 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a  user's temp dir.
2e890 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28  ** (via confstr(
2e8a0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
2e8b0 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77  TEMP_DIR,...)) w
2e8c0 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20  ill be used and 
2e8d0 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72  the.** actual pr
2e8e0 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  oxy file name is
2e8f0 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
2e900 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74  the name and pat
2e910 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  h of the.** data
2e920 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20  base file.  For 
2e930 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
2e940 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73       For databas
2e950 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d  e path "/Users/m
2e960 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20  e/foo.db" .**   
2e970 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74      The lock pat
2e980 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64  h will be "<tmpd
2e990 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73  ir>/sqliteplocks
2e9a0 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64  /_Users_me_foo.d
2e9b0 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20  b:auto:").**.** 
2e9c0 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78  Once a lock prox
2e9d0 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  y is configured 
2e9e0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
2e9f0 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61  onnection, it ca
2ea00 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f  n not.** be remo
2ea10 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20  ved, however it 
2ea20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20  may be switched 
2ea30 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2ea40 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a  roxy path via.**
2ea50 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20   the above APIs 
2ea60 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f  (assuming the co
2ea70 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nch file is not 
2ea80 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e  being held by an
2ea90 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74  other.** connect
2eaa0 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e  ion or process).
2eab0 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70   .**.**.** How p
2eac0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  roxy locking wor
2ead0 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
2eae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
2eaf0 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c  .** Proxy file l
2eb00 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72  ocking relies pr
2eb10 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e  imarily on two n
2eb20 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69  ew supporting fi
2eb30 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  les: .**.**   * 
2eb40 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c   conch file to l
2eb50 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74  imit access to t
2eb60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2eb70 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73   to a single hos
2eb80 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74  t.**      at a t
2eb90 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70  ime.**.**   *  p
2eba0 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74  roxy file to act
2ebb0 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20   as a proxy for 
2ebc0 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  the advisory loc
2ebd0 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20  ks normally.**  
2ebe0 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65      taken on the
2ebf0 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
2ec00 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d  The conch file -
2ec10 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20   to use a proxy 
2ec20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73  file, sqlite mus
2ec30 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68  t first "hold th
2ec40 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74  e conch".** by t
2ec50 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d  aking an sqlite-
2ec60 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63  style shared loc
2ec70 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
2ec80 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65  ile, reading the
2ec90 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  .** contents and
2eca0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68   comparing the h
2ecb0 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73  ost's unique hos
2ecc0 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29  t ID (see below)
2ecd0 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f   and lock.** pro
2ece0 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20  xy path against 
2ecf0 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
2ed00 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20  d in the conch. 
2ed10 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
2ed20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  is.** stored in 
2ed30 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
2ed40 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ry as the databa
2ed50 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
2ed60 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20  file name.** is 
2ed70 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20  patterned after 
2ed80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ed90 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74  e name as ".<dat
2eda0 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68  abasename>-conch
2edb0 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  "..** If the con
2edc0 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  ch file does not
2edd0 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20   exist, or it's 
2ede0 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20  contents do not 
2edf0 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73  match the.** hos
2ee00 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78  t ID and/or prox
2ee10 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65  y path, then the
2ee20 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74   lock is escalat
2ee30 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69  ed to an exclusi
2ee40 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74  ve.** lock and t
2ee50 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
2ee60 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65  ntents is update
2ee70 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20  d with the host 
2ee80 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20  ID and proxy.** 
2ee90 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63  path and the loc
2eea0 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20  k is downgraded 
2eeb0 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
2eec0 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20   again.  If the 
2eed0 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64  conch.** is held
2eee0 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   by another proc
2eef0 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72  ess (with a shar
2ef00 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78  ed lock), the ex
2ef10 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
2ef20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51  will fail and SQ
2ef30 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
2ef40 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
2ef50 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20   proxy file - a 
2ef60 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65  single-byte file
2ef70 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64   used for all ad
2ef80 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b  visory file lock
2ef90 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61  s.** normally ta
2efa0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
2efb0 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73  ase file.   This
2efc0 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65   allows for safe
2efd0 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74   sharing.** of t
2efe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2eff0 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65   for multiple re
2f000 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
2f010 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
2f020 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68   host (the conch
2f030 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
2f040 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73  ey all use the s
2f050 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  ame local lock f
2f060 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75  ile)..**.** Requ
2f070 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  esting the lock 
2f080 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69  proxy does not i
2f090 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20  mmediately take 
2f0a0 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73  the conch, it is
2f0b0 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77  .** only taken w
2f0c0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65  hen the first re
2f0d0 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61  quest to lock da
2f0e0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
2f0f0 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d  ade.  .** This m
2f100 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e  atches the seman
2f110 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64  tics of the trad
2f120 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  itional locking 
2f130 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a  behavior, where.
2f140 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e  ** opening a con
2f150 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
2f160 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20  abase file does 
2f170 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20  not take a lock 
2f180 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68  on it..** The sh
2f190 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e  ared lock and an
2f1a0 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   open file descr
2f1b0 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61  iptor are mainta
2f1c0 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74  ined until .** t
2f1d0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
2f1e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2f1f0 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   closed. .**.** 
2f200 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61  The proxy file a
2f210 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  nd the lock file
2f220 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74   are never delet
2f230 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20  ed so they only 
2f240 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72  need.** to be cr
2f250 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20  eated the first 
2f260 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73  time they are us
2f270 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67  ed..**.** Config
2f280 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a  uration options.
2f290 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
2f2a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20  --------.**.**  
2f2b0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2f2c0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a  OXY_LOCKING.**.*
2f2d0 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65  *       Database
2f2e0 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20   files accessed 
2f2f0 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  on non-local fil
2f300 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a  e systems are.**
2f310 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63         automatic
2f320 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ally configured 
2f330 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
2f340 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72  g, lock files ar
2f350 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64  e.**       named
2f360 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75   automatically u
2f370 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f  sing the same lo
2f380 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20  gic as.**       
2f390 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78  PRAGMA lock_prox
2f3a0 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a  y_file=":auto:".
2f3b0 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54  **    .**  SQLIT
2f3c0 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a  E_PROXY_DEBUG.**
2f3d0 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65  .**       Enable
2f3e0 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66  s the logging of
2f3f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
2f400 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66  during host id f
2f410 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ile.**       ret
2f420 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74  rieval and creat
2f430 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50  ion.**.**  LOCKP
2f440 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20  ROXYDIR.**.**   
2f450 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68      Overrides th
2f460 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74  e default direct
2f470 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
2f480 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68  k proxy files th
2f490 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20  at.**       are 
2f4a0 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
2f4b0 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75  lly via the ":au
2f4c0 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a  to:" setting.**.
2f4d0 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55  **  SQLITE_DEFAU
2f4e0 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
2f4f0 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20  ISSIONS.**.**   
2f500 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20      Permissions 
2f510 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61  to use when crea
2f520 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ting a directory
2f530 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65   for storing the
2f540 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70  .**       lock p
2f550 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79  roxy files, only
2f560 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50   used when LOCKP
2f570 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73  ROXYDIR is not s
2f580 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20  et..**    .**   
2f590 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65   .** As mentione
2f5a0 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f  d above, when co
2f5b0 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
2f5c0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2f5d0 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74  LOCKING,.** sett
2f5e0 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d  ing the environm
2f5f0 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c  ent variable SQL
2f600 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2f610 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c  LOCKING to 1 wil
2f620 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79  l.** force proxy
2f630 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75   locking to be u
2f640 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61  sed for every da
2f650 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
2f660 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c  ed, and 0.** wil
2f670 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69  l force automati
2f680 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  c proxy locking 
2f690 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66  to be disabled f
2f6a0 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
2f6b0 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63  ** files (explic
2f6c0 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  ity calling the 
2f6d0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
2f6e0 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20  ROXYFILE pragma 
2f6f0 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c  or.** sqlite_fil
2f700 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73  e_control API is
2f710 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79   not affected by
2f720 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2f730 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f  OXY_LOCKING)..*/
2f740 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  ../*.** Proxy lo
2f750 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
2f760 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53  ailable on MacOS
2f770 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  X .*/.#if define
2f780 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2f790 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2f7a0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
2f7b0 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b  ** The proxyLock
2f7c0 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74  ingContext has t
2f7d0 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65  he path and file
2f7e0 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
2f7f0 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61  the remote .** a
2f800 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66  nd local proxy f
2f810 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79  iles in it.*/.ty
2f820 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f  pedef struct pro
2f830 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2f840 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2f850 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f  text;.struct pro
2f860 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2f870 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63   {.  unixFile *c
2f880 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
2f890 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20    /* Open conch 
2f8a0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2f8b0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20  conchFilePath;  
2f8c0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2f8d0 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
2f8e0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2f8f0 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20  lockProxy;      
2f900 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79     /* Open proxy
2f910 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
2f920 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50  char *lockProxyP
2f930 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
2f940 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78  Name of the prox
2f950 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
2f960 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
2f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f980 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
2f990 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  n file */.  int 
2f9a0 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20  conchHeld;      
2f9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66           /* 1 if
2f9c0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65   the conch is he
2f9d0 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65  ld, -1 if lockle
2f9e0 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  ss */.  void *ol
2f9f0 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
2fa00 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2fa10 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
2fa20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
2fa30 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
2fa40 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
2fa50 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
2fa60 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
2fa70 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
2fa80 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
2fa90 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
2faa0 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
2fab0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
2fac0 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
2fad0 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
2fae0 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
2faf0 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
2fb00 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
2fb10 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
2fb20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
2fb30 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
2fb40 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2fb50 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
2fb60 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
2fb70 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
2fb80 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
2fb90 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
2fba0 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
2fbb0 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
2fbc0 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
2fbd0 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
2fbe0 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
2fbf0 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
2fc00 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2fc10 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
2fc20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
2fc30 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2fc40 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
2fc50 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
2fc60 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
2fc70 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
2fc80 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
2fc90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2fca0 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
2fcb0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
2fcc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fcd0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
2fce0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
2fcf0 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
2fd00 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
2fd10 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
2fd20 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
2fd30 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
2fd40 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
2fd50 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
2fd60 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
2fd70 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
2fd80 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
2fd90 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
2fda0 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
2fdb0 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
2fdc0 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
2fdd0 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
2fde0 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
2fdf0 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
2fe00 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
2fe10 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
2fe20 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
2fe30 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
2fe40 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
2fe50 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
2fe60 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
2fe70 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
2fe80 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
2fe90 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
2fea0 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
2feb0 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
2fec0 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
2fed0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
2fee0 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2fef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ff00 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43  OK;.}../* . ** C
2ff10 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20  reates the lock 
2ff20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73  file and any mis
2ff30 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  sing directories
2ff40 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f   in lockPath. */
2ff50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2ff60 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
2ff70 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
2ff80 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Path){.  int i, 
2ff90 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  len;.  char buf[
2ffa0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
2ffb0 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
2ffc0 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61  .  assert(lockPa
2ffd0 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20  th!=NULL);.  /* 
2ffe0 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c  try to create al
2fff0 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  l the intermedia
30000 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a  te directories *
30010 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  /.  len = (int)s
30020 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b  trlen(lockPath);
30030 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b  .  buf[0] = lock
30040 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20  Path[0];.  for( 
30050 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20  i=1; i<len; i++ 
30060 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  ){.    if( lockP
30070 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[i] == '/' &&
30080 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29   (i - start > 0)
30090 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c   ){.      /* onl
300a0 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20  y mkdir if leaf 
300b0 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f  dir != "." or "/
300c0 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20  " or ".." */.   
300d0 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32     if( i-start>2
300e0 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20   || (i-start==1 
300f0 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
30100 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
30110 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20  t] != '/') .    
30120 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74       || (i-start
30130 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==2 && buf[start
30140 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
30150 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29  start+1] != '.')
30160 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   ){.        buf[
30170 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20  i]='\0';.       
30180 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66   if( osMkdir(buf
30190 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
301a0 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
301b0 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
301c0 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
301d0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
301e0 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
301f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
30200 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
30210 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
30220 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
30230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30240 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
30250 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
30260 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
30270 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
30280 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
30290 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
302a0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
302b0 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20   return err;.   
302c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
302d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
302e0 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20   start=i+1;.    
302f0 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c  }.    buf[i] = l
30300 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a  ockPath[i];.  }.
30310 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
30320 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  TELOCKPATH  prox
30330 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
30340 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61  id=%d\n", lockPa
30350 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
30360 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
30370 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
30380 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
30390 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
303a0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
303b0 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
303c0 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
303d0 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
303e0 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
303f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
30400 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
30410 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
30420 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
30430 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
30440 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
30450 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
30460 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
30470 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
30480 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
30490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
304a0 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
304b0 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le(.    const ch
304c0 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
304d0 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65   /* path for the
304e0 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f   new unixFile */
304f0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a  .    unixFile **
30500 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  ppFile,       /*
30510 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65   unixFile create
30520 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62  d and returned b
30530 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74  y ref */.    int
30540 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20   islockfile     
30550 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20        /* if non 
30560 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72  zero missing dir
30570 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  s will be create
30580 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66  d */.) {.  int f
30590 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69  d = -1;.  unixFi
305a0 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  le *pNew;.  int 
305b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
305c0 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
305d0 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
305e0 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  AT;.  sqlite3_vf
305f0 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e  s dummyVfs;.  in
30600 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t terrno = 0;.  
30610 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
30620 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  nused = NULL;.. 
30630 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79   /* 1. first try
30640 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
30650 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e  the file.  ** 2.
30660 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
30670 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f  and this is a lo
30680 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e  ck file (not-con
30690 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e  ch), try creatin
306a0 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e  g.  ** the paren
306b0 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e  t directories an
306c0 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e  d then try again
306d0 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61  ..  ** 3. if tha
306e0 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20  t fails, try to 
306f0 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65  open the file re
30700 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  ad-only.  ** oth
30710 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55  erwise return BU
30720 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65  SY (if lock file
30730 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f  ) or CANTOPEN fo
30740 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
30750 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20  .  */.  pUnused 
30760 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
30770 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
30780 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64  );.  if( pUnused
30790 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e   ){.    fd = pUn
307a0 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73  used->fd;.  }els
307b0 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  e{.    pUnused =
307c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
307d0 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
307e0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75  );.    if( !pUnu
307f0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sed ){.      ret
30800 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
30810 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
30820 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64  ( fd<0 ){.    fd
30830 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
30840 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
30850 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
30860 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
30870 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
30880 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64  rrno;.    if( fd
30890 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
308a0 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c  ENT && islockfil
308b0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
308c0 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
308d0 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49  th(path) == SQLI
308e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
308f0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
30900 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
30910 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  s, SQLITE_DEFAUL
30920 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
30930 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NS);.      }.   
30940 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
30950 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61  0 ){.    openFla
30960 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
30970 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
30980 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
30990 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
309a0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
309b0 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e  IONS);.    terrn
309c0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20  o = errno;.  }. 
309d0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
309e0 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20   if( islockfile 
309f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
30a00 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
30a10 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74   }.    switch (t
30a20 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63  errno) {.      c
30a30 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20  ase EACCES:.    
30a40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30a50 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61  E_PERM;.      ca
30a60 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20  se EIO: .       
30a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
30a80 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76  OERR_LOCK; /* ev
30a90 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
30aa0 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20  the conch */.   
30ab0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
30ac0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30ad0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
30ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
30af0 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
30b00 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
30b10 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  c(sizeof(*pNew))
30b20 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55  ;.  if( pNew==NU
30b30 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  LL ){.    rc = S
30b40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
30b50 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65   goto end_create
30b60 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65  _proxy;.  }.  me
30b70 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
30b80 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
30b90 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61  .  pNew->openFla
30ba0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
30bb0 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56    memset(&dummyV
30bc0 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  fs, 0, sizeof(du
30bd0 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d  mmyVfs));.  dumm
30be0 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20  yVfs.pAppData = 
30bf0 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
30c00 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d  IoFinder;.  dumm
30c10 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75  yVfs.zName = "du
30c20 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d  mmy";.  pUnused-
30c30 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75  >fd = fd;.  pUnu
30c40 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65  sed->flags = ope
30c50 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  nFlags;.  pNew->
30c60 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
30c70 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  d;.  .  rc = fil
30c80 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d  lInUnixFile(&dum
30c90 6d 79 56 66 73 2c 20 66 64 2c 20 30 2c 20 28 73  myVfs, fd, 0, (s
30ca0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65  qlite3_file*)pNe
30cb0 77 2c 20 70 61 74 68 2c 20 30 2c 20 30 2c 20 30  w, path, 0, 0, 0
30cc0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
30cd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
30ce0 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20  pFile = pNew;.  
30cf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30d00 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61  OK;.  }.end_crea
30d10 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20  te_proxy:    .  
30d20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
30d30 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  w, fd, __LINE__)
30d40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
30d50 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65  (pNew);.  sqlite
30d60 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b  3_free(pUnused);
30d70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30d80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
30d90 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20  EST./* simulate 
30da0 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62  multiple hosts b
30db0 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75  y creating uniqu
30dc0 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61  e hostid file pa
30dd0 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ths */.int sqlit
30de0 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20  e3_hostid_num = 
30df0 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  0;.#endif..#defi
30e00 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  ne PROXY_HOSTIDL
30e10 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e  EN    16  /* con
30e20 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20  ch file host id 
30e30 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f  length */../* No
30e40 74 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64  t always defined
30e50 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 73 20   in the headers 
30e60 61 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  as it ought to b
30e70 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20  e */.extern int 
30e80 67 65 74 68 6f 73 74 75 75 69 64 28 75 75 69 64  gethostuuid(uuid
30e90 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72  _t id, const str
30ea0 75 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61  uct timespec *wa
30eb0 69 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65  it);../* get the
30ec0 20 68 6f 73 74 20 49 44 20 76 69 61 20 67 65 74   host ID via get
30ed0 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73  hostuuid(), pHos
30ee0 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  tID must point t
30ef0 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  o PROXY_HOSTIDLE
30f00 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77  N .** bytes of w
30f10 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a  ritable memory..
30f20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
30f30 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73  oxyGetHostID(uns
30f40 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73  igned char *pHos
30f50 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72  tID, int *pError
30f60 29 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58  ){.  assert(PROX
30f70 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73  Y_HOSTIDLEN == s
30f80 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a  izeof(uuid_t));.
30f90 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44    memset(pHostID
30fa0 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  , 0, PROXY_HOSTI
30fb0 44 4c 45 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e  DLEN);.#if defin
30fc0 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45  ed(__MAX_OS_X_VE
30fd0 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52  RSION_MIN_REQUIR
30fe0 45 44 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  ED)\.           
30ff0 20 20 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f      && __MAC_OS_
31000 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
31010 51 55 49 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a  QUIRED<1050.  {.
31020 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
31030 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
31040 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30   timeout = {1, 0
31050 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65  }; /* 1 sec time
31060 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  out */.    if( g
31070 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74  ethostuuid(pHost
31080 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b  ID, &timeout) ){
31090 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d  .      int err =
310a0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
310b0 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
310c0 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72      *pError = er
310d0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
310e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
310f0 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
31100 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
31110 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29  ARAMETER(pError)
31120 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
31130 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
31140 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70   simulate multip
31150 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61  le hosts by crea
31160 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74  ting unique host
31170 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f  id file paths */
31180 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68  .  if( sqlite3_h
31190 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b  ostid_num != 0){
311a0 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20  .    pHostID[0] 
311b0 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44  = (char)(pHostID
311c0 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c  [0] + (char)(sql
311d0 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
311e0 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65  & 0xFF));.  }.#e
311f0 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e  ndif.  .  return
31200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
31210 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
31220 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65   contains the he
31230 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e  ader, host id an
31240 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
31250 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  . */.#define PRO
31260 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
31270 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65  2   /* 1-byte he
31280 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f  ader, 16-byte ho
31290 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23  st id, path */.#
312a0 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41  define PROXY_HEA
312b0 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a  DERLEN    1   /*
312c0 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64   conch file head
312d0 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65  er length */.#de
312e0 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49  fine PROXY_PATHI
312f0 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48  NDEX    (PROXY_H
31300 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
31310 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e  OSTIDLEN).#defin
31320 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  e PROXY_MAXCONCH
31330 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44  LEN  (PROXY_HEAD
31340 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
31350 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e  IDLEN+MAXPATHLEN
31360 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20  )../* .** Takes 
31370 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69  an open conch fi
31380 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63  le, copies the c
31390 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77  ontents to a new
313a0 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d   path and then m
313b0 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b  oves .** it back
313c0 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65  .  The newly cre
313d0 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65  ated file's file
313e0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
313f0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a  ssigned to the.*
31400 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72  * conch file str
31410 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c  ucture and final
31420 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ly the original 
31430 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72  conch file descr
31440 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f  iptor is .** clo
31450 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65  sed.  Returns ze
31460 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ro if successful
31470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31480 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
31490 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
314a0 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f  ile, uuid_t myHo
314b0 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  stID){.  proxyLo
314c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
314d0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
314e0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
314f0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
31500 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
31510 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
31520 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63  ->conchFile;.  c
31530 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54  har tPath[MAXPAT
31540 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75  HLEN];.  char bu
31550 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
31560 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50  LEN];.  char *cP
31570 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ath = pCtx->conc
31580 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a  hFilePath;.  siz
31590 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b  e_t readLen = 0;
315a0 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65  .  size_t pathLe
315b0 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72  n = 0;.  char er
315c0 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20  rmsg[64] = "";. 
315d0 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
315e0 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55  int rc = -1;.  U
315f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
31600 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a  myHostID);..  /*
31610 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
31620 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68  th by replace th
31630 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e  e trailing '-con
31640 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b  ch' with '-break
31650 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d  ' */.  pathLen =
31660 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20   strlcpy(tPath, 
31670 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  cPath, MAXPATHLE
31680 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65  N);.  if( pathLe
31690 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20  n>MAXPATHLEN || 
316a0 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20  pathLen<6 || .  
316b0 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61     (strlcpy(&tPa
316c0 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22  th[pathLen-5], "
316d0 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29  break", 6) != 5)
316e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
316f0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
31700 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22  errmsg),errmsg,"
31710 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20  path error (len 
31720 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65  %d)",(int)pathLe
31730 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
31740 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
31750 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f    /* read the co
31760 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  nch content */. 
31770 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65   readLen = osPre
31780 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
31790 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43   buf, PROXY_MAXC
317a0 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69  ONCHLEN, 0);.  i
317b0 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59  f( readLen<PROXY
317c0 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20  _PATHINDEX ){.  
317d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
317e0 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
317f0 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65  ),errmsg,"read e
31800 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28  rror (len %d)",(
31810 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20  int)readLen);.  
31820 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
31830 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77  lock;.  }.  /* w
31840 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
31850 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65  he temporary bre
31860 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20  ak file */.  fd 
31870 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50  = robust_open(tP
31880 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43  ath, (O_RDWR|O_C
31890 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 0a 20 20  REAT|O_EXCL),.  
318a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
318c0 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
318d0 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
318e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
318f0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
31900 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63  msg), errmsg, "c
31910 72 65 61 74 65 20 66 61 69 6c 65 64 20 28 25 64  reate failed (%d
31920 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
31930 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
31940 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  ck;.  }.  if( os
31950 50 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20  Pwrite(fd, buf, 
31960 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28  readLen, 0) != (
31970 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20  ssize_t)readLen 
31980 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
31990 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
319a0 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
319b0 22 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25  "write failed (%
319c0 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
319d0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
319e0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ock;.  }.  if( r
319f0 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61  ename(tPath, cPa
31a00 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  th) ){.    sqlit
31a10 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
31a20 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
31a30 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c  sg, "rename fail
31a40 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
31a50 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
31a60 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
31a70 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74  rc = 0;.  fprint
31a80 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65  f(stderr, "broke
31a90 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25   stale lock on %
31aa0 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20  s\n", cPath);.  
31ab0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
31ac0 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  le, conchFile->h
31ad0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63  , __LINE__);.  c
31ae0 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64  onchFile->h = fd
31af0 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f  ;.  conchFile->o
31b00 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
31b10 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e  R | O_CREAT;..en
31b20 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69  d_breaklock:.  i
31b30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
31b40 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
31b50 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b  osUnlink(tPath);
31b60 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
31b70 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f  ose(pFile, fd, _
31b80 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
31b90 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
31ba0 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62  rr, "failed to b
31bb0 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20  reak stale lock 
31bc0 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50  on %s, %s\n", cP
31bd0 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20  ath, errmsg);.  
31be0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
31bf0 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65  ../* Take the re
31c00 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20  quested lock on 
31c10 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61  the conch file a
31c20 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65  nd break a stale
31c30 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a   lock if the .**
31c40 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
31c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31c60 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75  proxyConchLock(u
31c70 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
31c80 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c  uuid_t myHostID,
31c90 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a   int lockType){.
31ca0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
31cb0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
31cc0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
31cd0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
31ce0 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
31cf0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
31d00 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
31d10 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
31d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
31d30 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20  t nTries = 0;.  
31d40 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
31d50 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20  conchModTime;.  
31d60 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68  .  memset(&conch
31d70 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65  ModTime, 0, size
31d80 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29  of(conchModTime)
31d90 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  );.  do {.    rc
31da0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
31db0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
31dc0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
31dd0 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
31de0 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b  ;.    nTries ++;
31df0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
31e00 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
31e10 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b    /* If the lock
31e20 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a   failed (busy):.
31e30 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79         * 1st try
31e40 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69  : get the mod ti
31e50 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c  me of the conch,
31e60 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74   wait 0.5s and t
31e70 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20  ry again. .     
31e80 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69    * 2nd try: fai
31e90 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d  l if the mod tim
31ea0 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73  e changed or hos
31eb0 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e  t id is differen
31ec0 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20  t, wait .       
31ed0 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73  *           10 s
31ee0 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ec and try again
31ef0 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72  .       * 3rd tr
31f00 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  y: break the loc
31f10 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64  k unless the mod
31f20 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65   time has change
31f30 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d..       */.   
31f40 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
31f50 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73  uf;.      if( os
31f60 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d  Fstat(conchFile-
31f70 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
31f80 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
31f90 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
31fa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
31fb0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
31fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
31fd0 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
31fe0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
31ff0 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75  onchModTime = bu
32000 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a  f.st_mtimespec;.
32010 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35          usleep(5
32020 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
32030 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20  0.5 sec and try 
32040 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f  the lock again*/
32050 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
32060 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e;  .      }..  
32070 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
32080 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66  es>1 );.      if
32090 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74  ( conchModTime.t
320a0 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  v_sec != buf.st_
320b0 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63  mtimespec.tv_sec
320c0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f   || .         co
320d0 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73  nchModTime.tv_ns
320e0 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
320f0 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29  mespec.tv_nsec )
32100 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
32110 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
32120 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
32130 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32     if( nTries==2
32140 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68   ){  .        ch
32150 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41  ar tBuf[PROXY_MA
32160 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
32170 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73      int len = os
32180 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d  Pread(conchFile-
32190 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f  >h, tBuf, PROXY_
321a0 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b  MAXCONCHLEN, 0);
321b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
321c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
321d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
321e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
321f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32200 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
32210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32220 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41  if( len>PROXY_PA
32230 54 48 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b  THINDEX && tBuf[
32240 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f  0]==(char)PROXY_
32250 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20  CONCHVERSION){. 
32260 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27           /* don'
32270 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  t break the lock
32280 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
32290 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f  doesn't match */
322a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
322b0 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50  !=memcmp(&tBuf[P
322c0 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c  ROXY_HEADERLEN],
322d0 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59   myHostID, PROXY
322e0 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20  _HOSTIDLEN) ){. 
322f0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
32300 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
32310 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32330 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65      /* don't bre
32340 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73  ak the lock on s
32350 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61 20 76  hort read or a v
32360 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20  ersion mismatch 
32370 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
32380 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
32390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
323a0 20 20 20 75 73 6c 65 65 70 28 31 30 30 30 30 30     usleep(100000
323b0 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20  00); /* wait 10 
323c0 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20  sec and try the 
323d0 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20  lock again */.  
323e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
323f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
32400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54        assert( nT
32410 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20  ries==3 );.     
32420 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65   if( 0==proxyBre
32430 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c  akConchLock(pFil
32440 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a  e, myHostID) ){.
32450 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
32460 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
32470 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58  if( lockType==EX
32480 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
32490 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
324a0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
324b0 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
324c0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
324d0 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  e, SHARED_LOCK);
324e0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
324f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
32500 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
32510 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
32520 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
32530 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
32540 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54  conchFile, lockT
32550 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ype);.        }.
32560 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
32570 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c  } while( rc==SQL
32580 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69  ITE_BUSY && nTri
32590 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74  es<3 );.  .  ret
325a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
325b0 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79  kes the conch by
325c0 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64   taking a shared
325d0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74   lock and read t
325e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63  he contents conc
325f0 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61  h, if .** lockPa
32600 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  th is non-NULL, 
32610 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
32620 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d  lock file path m
32630 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55  ust match.  A NU
32640 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  LL .** lockPath 
32650 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c  means that the l
32660 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63  ockPath in the c
32670 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
32680 65 20 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a  e used if the .*
32690 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68  * host IDs match
326a0 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20  , or a new lock 
326b0 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e  path will be gen
326c0 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63  erated automatic
326d0 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69  ally .** and wri
326e0 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63  tten to the conc
326f0 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  h file..*/.stati
32700 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43  c int proxyTakeC
32710 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  onch(unixFile *p
32720 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  File){.  proxyLo
32730 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
32740 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
32750 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
32760 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
32770 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74  t; .  .  if( pCt
32780 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20  x->conchHeld!=0 
32790 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
327a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
327b0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
327c0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
327d0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20  ->conchFile;.   
327e0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
327f0 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72  ;.    int pError
32800 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72   = 0;.    char r
32810 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58  eadBuf[PROXY_MAX
32820 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63  CONCHLEN];.    c
32830 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58  har lockPath[MAX
32840 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68  PATHLEN];.    ch
32850 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68  ar *tempLockPath
32860 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
32870 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32880 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74 65 43  .    int createC
32890 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  onch = 0;.    in
328a0 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20  t hostIdMatch = 
328b0 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c  0;.    int readL
328c0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  en = 0;.    int 
328d0 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
328e0 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63   0;.    int forc
328f0 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30  eNewLockPath = 0
32900 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41  ;.    .    OSTRA
32910 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE(("TAKECONCH  
32920 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
32930 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
32940 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
32950 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
32960 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
32970 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
32980 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29  uto:"), getpid()
32990 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72  ));..    rc = pr
329a0 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48  oxyGetHostID(myH
329b0 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b  ostID, &pError);
329c0 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
329d0 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
329e0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
329f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72  >lastErrno = pEr
32a00 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ror;.      goto 
32a10 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
32a20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72     }.    rc = pr
32a30 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
32a40 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48  le, myHostID, SH
32a50 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
32a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32a70 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
32a80 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
32a90 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64     }.    /* read
32aa0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f   the existing co
32ab0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nch file */.    
32ac0 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e  readLen = seekAn
32ad0 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a  dRead((unixFile*
32ae0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72  )conchFile, 0, r
32af0 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  eadBuf, PROXY_MA
32b00 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20  XCONCHLEN);.    
32b10 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b  if( readLen<0 ){
32b20 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72  .      /* I/O er
32b30 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73  ror: lastErrno s
32b40 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
32b50 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  d */.      pFile
32b60 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f  ->lastErrno = co
32b70 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  nchFile->lastErr
32b80 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
32b90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
32ba0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
32bb0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
32bc0 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65  }else if( readLe
32bd0 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52  n<=(PROXY_HEADER
32be0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
32bf0 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  LEN) || .       
32c00 20 20 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d        readBuf[0]
32c10 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  !=(char)PROXY_CO
32c20 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20  NCHVERSION ){.  
32c30 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72      /* a short r
32c40 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66  ead or version f
32c50 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d  ormat mismatch m
32c60 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
32c70 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20  create a new .  
32c80 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c      ** conch fil
32c90 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
32ca0 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d     createConch =
32cb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   1;.    }.    /*
32cc0 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
32cd0 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68 65 20  matches and the 
32ce0 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64  lock path alread
32cf0 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  y exists in the 
32d00 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27  conch.    ** we'
32d10 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
32d20 65 20 70 61 74 68 20 74 68 65 72 65 2c 20 69 66  e path there, if
32d30 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74   we can't open t
32d40 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20  hat path, we'll 
32d50 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69  .    ** retry wi
32d60 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65  th a new auto-ge
32d70 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a 20 20  nerated path .  
32d80 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a    */.    do { /*
32d90 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64   in case we need
32da0 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f   to try again fo
32db0 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65  r an :auto: name
32dc0 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a  d lock file */..
32dd0 20 20 20 20 20 20 69 66 28 20 21 63 72 65 61 74        if( !creat
32de0 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65  eConch && !force
32df0 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  NewLockPath ){. 
32e00 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74         hostIdMat
32e10 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65  ch = !memcmp(&re
32e20 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  adBuf[PROXY_HEAD
32e30 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
32e40 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
32e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e60 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49       PROXY_HOSTI
32e70 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f  DLEN);.        /
32e80 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68  * if the conch h
32e90 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20  as data compare 
32ea0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  the contents */.
32eb0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74          if( !pCt
32ec0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
32ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
32ee0 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20   for auto-named 
32ef0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c  local lock file,
32f00 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   just check the 
32f10 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c  host ID and we'l
32f20 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l.           ** 
32f30 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  use the local lo
32f40 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 68 61  ck file path tha
32f50 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  t's already in t
32f60 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
32f70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
32f80 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a   hostIdMatch ){.
32f90 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
32fa0 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65  _t pathLen = (re
32fb0 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41  adLen - PROXY_PA
32fc0 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20  THINDEX);.      
32fd0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
32fe0 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d     if( pathLen>=
32ff0 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20  MAXPATHLEN ){.  
33000 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
33010 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31  Len=MAXPATHLEN-1
33020 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
33030 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
33040 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65  py(lockPath, &re
33050 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48  adBuf[PROXY_PATH
33060 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29  INDEX], pathLen)
33070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ;.            lo
33080 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20  ckPath[pathLen] 
33090 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
330a0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20   tempLockPath = 
330b0 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20  lockPath;.      
330c0 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b        tryOldLock
330d0 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  Path = 1;.      
330e0 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
330f0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
33100 63 6b 20 70 61 74 68 20 69 66 20 74 68 65 20 63  ck path if the c
33110 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f  onch is taken */
33120 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
33130 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
33140 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
33150 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
33160 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20  ostIdMatch.     
33170 20 20 20 20 20 20 20 20 20 20 26 26 20 21 73 74            && !st
33180 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
33190 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64  ProxyPath, &read
331a0 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
331b0 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  DEX],.          
331c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331d0 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50   readLen-PROXY_P
331e0 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20  ATHINDEX).      
331f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
33200 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64  * conch host and
33210 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68   lock path match
33220 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
33230 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
33240 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
33250 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
33260 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63    /* if the conc
33270 68 20 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65  h isn't writable
33280 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74   and doesn't mat
33290 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b  ch, we can't tak
332a0 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  e it */.      if
332b0 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70  ( (conchFile->op
332c0 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20  enFlags&O_RDWR) 
332d0 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
332e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
332f0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
33300 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
33310 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
33320 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65     /* either the
33330 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61   conch didn't ma
33340 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74  tch or we need t
33350 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  o create a new o
33360 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ne */.      if( 
33370 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
33380 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
33390 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
333a0 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c  (pCtx->dbPath, l
333b0 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
333c0 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65  LEN);.        te
333d0 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63  mpLockPath = loc
333e0 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f  kPath;.        /
333f0 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  * create a copy 
33400 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  of the lock path
33410 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63   _only_ if the c
33420 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f  onch is taken */
33430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
33440 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20        /* update 
33450 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20  conch with host 
33460 61 6e 64 20 70 61 74 68 20 28 74 68 69 73 20 77  and path (this w
33470 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65  ill fail if othe
33480 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20  r process.      
33490 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65 64 20  ** has a shared 
334a0 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69  lock already), i
334b0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
334c0 74 63 68 65 73 2c 20 75 73 65 20 74 68 65 20 62  tches, use the b
334d0 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63  ig.      ** stic
334e0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
334f0 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46    futimes(conchF
33500 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20  ile->h, NULL);. 
33510 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d       if( hostIdM
33520 61 74 63 68 20 26 26 20 21 63 72 65 61 74 65 43  atch && !createC
33530 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  onch ){.        
33540 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  if( conchFile->p
33550 49 6e 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69  Inode && conchFi
33560 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
33570 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  red>1 ){.       
33580 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
33590 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
335a0 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
335b0 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
335c0 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
335d0 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
335e0 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
335f0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
33600 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
33610 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
33620 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20         } else { 
33630 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
33640 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f      rc = proxyCo
33650 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
33660 79 48 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49  yHostID, EXCLUSI
33670 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
33680 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
33690 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f  .        rc = co
336a0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
336b0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
336c0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
336d0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
336e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
336f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33700 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  OK ){.        ch
33710 61 72 20 77 72 69 74 65 42 75 66 66 65 72 5b 50  ar writeBuffer[P
33720 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
33730 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77  ];.        int w
33740 72 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20  riteSize = 0;.  
33750 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 77        .        w
33760 72 69 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20  riteBuffer[0] = 
33770 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
33780 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20  HVERSION;.      
33790 20 20 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42    memcpy(&writeB
337a0 75 66 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44  uffer[PROXY_HEAD
337b0 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
337c0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
337d0 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  N);.        if( 
337e0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
337f0 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ath!=NULL ){.   
33800 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
33810 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
33820 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43  Y_PATHINDEX], pC
33830 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
33840 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
33850 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
33860 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79           strlcpy
33870 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
33880 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20  OXY_PATHINDEX], 
33890 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41  tempLockPath, MA
338a0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
338b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69     }.        wri
338c0 74 65 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50  teSize = PROXY_P
338d0 41 54 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65  ATHINDEX + strle
338e0 6e 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50  n(&writeBuffer[P
338f0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29  ROXY_PATHINDEX])
33900 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
33910 5f 66 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68  _ftruncate(conch
33920 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69  File->h, writeSi
33930 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ze);.        rc 
33940 3d 20 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c  = unixWrite((sql
33950 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63  ite3_file *)conc
33960 68 46 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66  hFile, writeBuff
33970 65 72 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30  er, writeSize, 0
33980 29 3b 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63  );.        fsync
33990 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a  (conchFile->h);.
339a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
339b0 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 63   created a new c
339c0 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a  onch file (not j
339d0 75 73 74 20 75 70 64 61 74 65 64 20 74 68 65 20  ust updated the 
339e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20  contents of a . 
339f0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64          ** valid
33a00 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72   conch file), tr
33a10 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70  y to match the p
33a20 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68  ermissions of th
33a30 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
33a40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33a60 4b 20 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68  K && createConch
33a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
33a80 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
33a90 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
33aa0 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65   = osFstat(pFile
33ab0 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20  ->h, &buf);.    
33ac0 20 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30        if( err==0
33ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33ae0 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62  mode_t cmode = b
33af0 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52  uf.st_mode&(S_IR
33b00 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f  USR|S_IWUSR | S_
33b10 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a  IRGRP|S_IWGRP |.
33b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b40 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c          S_IROTH|
33b50 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20  S_IWOTH);.      
33b60 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20        /* try to 
33b70 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62 61  match the databa
33b80 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d  se file R/W perm
33b90 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20  issions, ignore 
33ba0 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64  failure */.#ifnd
33bb0 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f  ef SQLITE_PROXY_
33bc0 44 45 42 55 47 0a 20 20 20 20 20 20 20 20 20 20  DEBUG.          
33bd0 20 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68    osFchmod(conch
33be0 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b  File->h, cmode);
33bf0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
33c00 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
33c10 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 68 6d       rc = osFchm
33c20 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  od(conchFile->h,
33c30 20 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   cmode);.       
33c40 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d       }while( rc=
33c50 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d  =(-1) && errno==
33c60 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 20  EINTR );.       
33c70 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
33c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
33c90 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
33ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
33cb0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
33cc0 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45  "fchmod %o FAILE
33cd0 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c  D with %d %s\n",
33ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33cf0 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f         cmode, co
33d00 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64  de, strerror(cod
33d10 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
33d20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
33d30 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
33d40 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
33d50 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63  %o SUCCEDED\n",c
33d60 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
33d70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
33d80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
33d90 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
33da0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
33db0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
33dc0 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d  "STAT FAILED[%d]
33dd0 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20   with %d %s\n", 
33de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33df0 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20       err, code, 
33e00 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b  strerror(code));
33e10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
33e20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
33e30 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63      }.      conc
33e40 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
33e50 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
33e60 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
33e70 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
33e80 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74        .    end_t
33e90 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20  akeconch:.      
33ea0 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
33eb0 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c  ROXY: CLOSE  %d\
33ec0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
33ed0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33ee0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
33ef0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20  ->openFlags ){. 
33f00 20 20 20 20 20 20 20 69 6e 74 20 66 64 3b 0a 20         int fd;. 
33f10 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
33f20 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
33f30 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
33f40 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  (pFile, pFile->h
33f50 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
33f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
33f70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
33f80 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73        fd = robus
33f90 74 5f 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50  t_open(pCtx->dbP
33fa0 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  ath, pFile->open
33fb0 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
33fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
33fd0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
33fe0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
33ff0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
34000 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45  "TRANSPROXY: OPE
34010 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a  N  %d\n", fd));.
34020 20 20 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d          if( fd>=
34030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
34040 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
34050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34060 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45         rc=SQLITE
34070 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20  _CANTOPEN_BKPT; 
34080 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20  /* SQLITE_BUSY? 
34090 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63  proxyTakeConch c
340a0 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20  alled.          
340b0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20   during locking 
340c0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
340d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
340e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
340f0 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
34100 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
34110 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63   *path = tempLoc
34120 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b  kPath ? tempLock
34130 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63  Path : pCtx->loc
34140 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
34150 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
34160 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74  eateUnixFile(pat
34170 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h, &pCtx->lockPr
34180 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  oxy, 1);.       
34190 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
341a0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
341b0 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64  _NOMEM && tryOld
341c0 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
341d0 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
341e0 64 6e 27 74 20 63 72 65 61 74 65 20 74 68 65 20  dn't create the 
341f0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
34200 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63  with the old loc
34210 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20  k file path.    
34220 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 72 79         ** so try
34230 20 61 67 61 69 6e 20 76 69 61 20 61 75 74 6f 2d   again via auto-
34240 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20 20 20  naming .        
34250 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
34260 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
34270 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
34280 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
34290 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   0;.          co
342a0 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61  ntinue; /* go ba
342b0 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20  ck to the do {} 
342c0 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f 69 6e  while start poin
342d0 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a  t, try again */.
342e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
342f0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
34300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34310 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
34320 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70  make a copy of p
34330 61 74 68 20 69 66 20 77 65 20 65 78 74 72 61 63  ath if we extrac
34340 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20  ted the value.  
34350 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74         ** from t
34360 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72  he conch file or
34370 20 74 68 65 20 70 61 74 68 20 77 61 73 20 61 6c   the path was al
34380 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73  located on the s
34390 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f  tack.         */
343a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 6d  .        if( tem
343b0 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  pLockPath ){.   
343c0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63         pCtx->loc
343d0 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
343e0 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
343f0 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20  tempLockPath);. 
34400 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
34410 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
34420 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h ){.           
34430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
34440 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
34450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34460 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
34470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34480 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
34490 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  Held = 1;.      
344a0 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
344b0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e  Ctx->lockProxy->
344c0 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49  pMethod == &afpI
344d0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
344e0 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67        afpLocking
344f0 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74 78 3b  Context *afpCtx;
34500 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74  .          afpCt
34510 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  x = (afpLockingC
34520 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c  ontext *)pCtx->l
34530 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e  ockProxy->lockin
34540 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
34550 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62 50 61      afpCtx->dbPa
34560 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th = pCtx->lockP
34570 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
34580 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65    }.      } else
34590 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68   {.        conch
345a0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
345b0 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
345c0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
345d0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
345e0 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
345f0 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
34600 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c   %s\n", conchFil
34610 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
34620 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
34630 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22  OK?"ok":"failed"
34640 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
34650 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65   rc;.    } while
34660 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65   (1); /* in case
34670 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 72   we need to retr
34680 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63  y the :auto: loc
34690 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20 20 20 20  k file - .      
346a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 65             ** we
346b0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65   should never ge
346c0 74 20 68 65 72 65 20 65 78 63 65 70 74 20 76 69  t here except vi
346d0 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27  a the 'continue'
346e0 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a   call. */.  }.}.
346f0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20  ./*.** If pFile 
34700 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20  holds a lock on 
34710 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68  a conch file, th
34720 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74 20  en release that 
34730 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
34740 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65  int proxyRelease
34750 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a  Conch(unixFile *
34760 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
34770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
34780 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
34790 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ine return code 
347a0 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  */.  proxyLockin
347b0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20  gContext *pCtx; 
347c0 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20   /* The locking 
347d0 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20  context for the 
347e0 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20  proxy lock */.  
347f0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
34800 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ile;        /* N
34810 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
34820 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78   file */..  pCtx
34830 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
34840 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
34850 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
34860 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  .  conchFile = p
34870 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
34880 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45    OSTRACE(("RELE
34890 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  ASECONCH  %d for
348a0 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
348b0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
348c0 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
348d0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
348e0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
348f0 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
34900 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70  .           getp
34910 69 64 28 29 29 29 3b 0a 20 20 69 66 28 20 70 43  id()));.  if( pC
34920 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
34930 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  ){.    rc = conc
34940 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
34950 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
34960 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
34970 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  , NO_LOCK);.  }.
34980 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
34990 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45  d = 0;.  OSTRACE
349a0 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  (("RELEASECONCH 
349b0 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68   %d %s\n", conch
349c0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
349d0 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
349e0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
349f0 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72  led")));.  retur
34a00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
34a10 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
34a20 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
34a30 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61  , compute the na
34a40 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20  me of its conch 
34a50 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74  file..** Store t
34a60 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
34a70 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  e in memory obta
34a80 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
34a90 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d  3_malloc()..** M
34aa0 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20  ake *pConchPath 
34ab0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
34ac0 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53   name.  Return S
34ad0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
34ae0 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ess.** or SQLITE
34af0 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65  _NOMEM if unable
34b00 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72   to obtain memor
34b10 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
34b20 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
34b30 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
34b40 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
34b50 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  ed memory.** spa
34b60 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  ce is eventually
34b70 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70   freed..**.** *p
34b80 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74  ConchPath is set
34b90 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65   to NULL if a me
34ba0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
34bb0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
34bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
34bd0 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68  yCreateConchPath
34be0 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74  name(char *dbPat
34bf0 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68  h, char **pConch
34c00 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Path){.  int i; 
34c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
34c30 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
34c40 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  len = (int)strle
34c50 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65  n(dbPath); /* Le
34c60 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65  ngth of database
34c70 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61   filename - dbPa
34c80 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  th */.  char *co
34c90 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20  nchPath;        
34ca0 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20        /* buffer 
34cb0 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73  in which to cons
34cc0 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65  truct conch name
34cd0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
34ce0 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
34cf0 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20   conch filename 
34d00 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
34d10 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20  he name to.  ** 
34d20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
34d30 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
34d40 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a  e file. */  .  *
34d50 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e  pConchPath = con
34d60 63 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a  chPath = (char *
34d70 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
34d80 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20  len + 8);.  if( 
34d90 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a  conchPath==0 ){.
34da0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34db0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
34dc0 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c  emcpy(conchPath,
34dd0 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b   dbPath, len+1);
34de0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73  .  .  /* now ins
34df0 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65  ert a "." before
34e00 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72   the last / char
34e10 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20  acter */.  for( 
34e20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b  i=(len-1); i>=0;
34e30 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20   i-- ){.    if( 
34e40 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f  conchPath[i]=='/
34e50 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  ' ){.      i++;.
34e60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
34e70 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61   }.  }.  conchPa
34e80 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69  th[i]='.';.  whi
34e90 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20  le ( i<len ){.  
34ea0 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d    conchPath[i+1]
34eb0 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20  =dbPath[i];.    
34ec0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61  i++;.  }..  /* a
34ed0 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63  ppend the "-conc
34ee0 68 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65  h" suffix to the
34ef0 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70   file */.  memcp
34f00 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31  y(&conchPath[i+1
34f10 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b  ], "-conch", 7);
34f20 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29  .  assert( (int)
34f30 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68  strlen(conchPath
34f40 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20  ) == len+7 );.. 
34f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34f60 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20  K;.}.../* Takes 
34f70 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72  a fully configur
34f80 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ed proxy locking
34f90 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65  -style unix file
34fa0 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a   and switches.**
34fb0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
34fc0 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74  file path .*/.st
34fd0 61 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c  atic int switchL
34fe0 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69  ockProxyPath(uni
34ff0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
35000 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
35010 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
35020 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
35030 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
35040 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  text*)pFile->loc
35050 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63  kingContext;.  c
35060 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70  har *oldPath = p
35070 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
35080 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  th;.  int rc = S
35090 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
350a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
350b0 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k!=NO_LOCK ){.  
350c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
350d0 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f  BUSY;.  }  ..  /
350e0 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
350f0 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20 4e  if the path is N
35100 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d  ULL, :auto: or m
35110 61 74 63 68 65 73 20 74 68 65 20 65 78 69 73 74  atches the exist
35120 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66  ing path */.  if
35130 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b  ( !path || path[
35140 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72  0]=='\0' || !str
35150 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f  cmp(path, ":auto
35160 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50  :") ||.    (oldP
35170 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28  ath && !strncmp(
35180 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d  oldPath, path, M
35190 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20  AXPATHLEN)) ){. 
351a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
351b0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
351c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
351d0 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  Proxy = pCtx->lo
351e0 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74  ckProxy;.    pCt
351f0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c  x->lockProxy=NUL
35200 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  L;.    pCtx->con
35210 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20  chHeld = 0;.    
35220 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e  if( lockProxy!=N
35230 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  ULL ){.      rc=
35240 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
35250 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
35260 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50  te3_file *)lockP
35270 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
35280 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
35290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
352a0 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
352b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
352c0 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b  3_free(oldPath);
352d0 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
352e0 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74  roxyPath = sqlit
352f0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 70 61  e3DbStrDup(0, pa
35300 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65  th);.  }.  .  re
35310 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35320 2a 20 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c  * pFile is a fil
35330 65 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  e that has been 
35340 6f 70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f  opened by a prio
35350 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64  r xOpen call.  d
35360 62 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74  bPath.** is a st
35370 72 69 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c  ring buffer at l
35380 65 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b  east MAXPATHLEN+
35390 31 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  1 characters in 
353a0 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  size..**.** This
353b0 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68   routine find th
353c0 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63  e filename assoc
353d0 69 61 74 65 64 20 77 69 74 68 20 70 46 69 6c 65  iated with pFile
353e0 20 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a   and writes it.*
353f0 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f  * int dbPath..*/
35400 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35410 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69  yGetDbPathForUni
35420 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  xFile(unixFile *
35430 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50  pFile, char *dbP
35440 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  ath){.#if define
35450 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69  d(__APPLE__).  i
35460 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
35470 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  d == &afpIoMetho
35480 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70  ds ){.    /* afp
35490 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72   style keeps a r
354a0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
354b0 64 62 20 70 61 74 68 20 69 6e 20 74 68 65 20 66  db path in the f
354c0 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20  ilePath field . 
354d0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72     ** of the str
354e0 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  uct */.    asser
354f0 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28  t( (int)strlen((
35500 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
35510 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41  kingContext)<=MA
35520 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20  XPATHLEN );.    
35530 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20  strlcpy(dbPath, 
35540 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ((afpLockingCont
35550 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
35560 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62  kingContext)->db
35570 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
35580 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64  );.  } else.#end
35590 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  if.  if( pFile->
355a0 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c  pMethod == &dotl
355b0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
355c0 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20      /* dot lock 
355d0 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c  style uses the l
355e0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74  ocking context t
355f0 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20  o store the dot 
35600 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65  lock.    ** file
35610 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
35620 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63   len = strlen((c
35630 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
35640 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73  kingContext) - s
35650 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55  trlen(DOTLOCK_SU
35660 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70  FFIX);.    memcp
35670 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
35680 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
35690 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31  Context, len + 1
356a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
356b0 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79  /* all other sty
356c0 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b  les use the lock
356d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73  ing context to s
356e0 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c 65  tore the db file
356f0 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73   path */.    ass
35700 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61  ert( strlen((cha
35710 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
35720 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
35730 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
35740 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68  lcpy(dbPath, (ch
35750 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
35760 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50  ingContext, MAXP
35770 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72  ATHLEN);.  }.  r
35780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20  .}../*.** Takes 
357a0 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65  an already fille
357b0 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61  d in unix file a
357c0 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20  nd alters it so 
357d0 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  all file locking
357e0 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72   .** will be per
357f0 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f  formed on the lo
35800 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  cal proxy lock f
35810 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ile.  The follow
35820 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72  ing fields.** ar
35830 65 20 70 72 65 73 65 72 76 65 64 20 69 6e 20 74  e preserved in t
35840 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
35850 78 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  xt so that they 
35860 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
35870 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78  and .** the unix
35880 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 70 65   structure prope
35890 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61  rly cleaned up a
358a0 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a  t close time:.**
358b0 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65    ->lockingConte
358c0 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64  xt.**  ->pMethod
358d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
358e0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
358f0 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  xFile(unixFile *
35900 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  pFile, const cha
35910 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f  r *path) {.  pro
35920 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
35930 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64   *pCtx;.  char d
35940 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  bPath[MAXPATHLEN
35950 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  +1];       /* Na
35960 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
35970 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
35980 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c  r *lockPath=NULL
35990 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
359a0 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28  ITE_OK;.  .  if(
359b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
359c0 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k!=NO_LOCK ){.  
359d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
359e0 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78  BUSY;.  }.  prox
359f0 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69  yGetDbPathForUni
35a00 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50  xFile(pFile, dbP
35a10 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74  ath);.  if( !pat
35a20 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c  h || path[0]=='\
35a30 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61  0' || !strcmp(pa
35a40 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b  th, ":auto:") ){
35a50 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55  .    lockPath=NU
35a60 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
35a70 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20   lockPath=(char 
35a80 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20  *)path;.  }.  . 
35a90 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53   OSTRACE(("TRANS
35aa0 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73  PROXY  %d for %s
35ab0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
35ac0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
35ad0 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63   (lockPath ? loc
35ae0 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  kPath : ":auto:"
35af0 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a  ), getpid()));..
35b00 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33    pCtx = sqlite3
35b10 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
35b20 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20  *pCtx) );.  if( 
35b30 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pCtx==0 ){.    r
35b40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
35b50 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
35b60 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCtx, 0, sizeof
35b70 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20  (*pCtx));..  rc 
35b80 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e  = proxyCreateCon
35b90 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50 61 74  chPathname(dbPat
35ba0 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h, &pCtx->conchF
35bb0 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20  ilePath);.  if( 
35bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35bd0 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43  .    rc = proxyC
35be0 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 43  reateUnixFile(pC
35bf0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
35c00 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h, &pCtx->conchF
35c10 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ile, 0);.    if(
35c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
35c30 4f 50 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d  OPEN && ((pFile-
35c40 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57  >openFlags&O_RDW
35c50 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20  R) == 0) ){.    
35c60 20 20 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20    /* if (a) the 
35c70 6f 70 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e  open flags are n
35c80 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74  ot O_RDWR, (b) t
35c90 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74  he conch isn't t
35ca0 68 65 72 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  here, and.      
35cb0 2a 2a 20 28 63 29 20 74 68 65 20 66 69 6c 65 20  ** (c) the file 
35cc0 73 79 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f  system is read-o
35cd0 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65  nly, then enable
35ce0 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65   no-locking acce
35cf0 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67 68  ss..      ** Ugh
35d00 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59  , since O_RDONLY
35d10 3d 3d 30 78 30 30 30 30 20 77 65 20 74 65 73 74  ==0x0000 we test
35d20 20 66 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 6e   for !O_RDWR sin
35d30 63 65 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 65  ce unixOpen asse
35d40 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  rts.      ** tha
35d50 74 20 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c  t openFlags will
35d60 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f   have only one o
35d70 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f  f O_RDONLY or O_
35d80 52 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  RDWR..      */. 
35d90 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
35da0 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20  fs fsInfo;.     
35db0 20 73 74 72 75 63 74 20 73 74 61 74 20 63 6f 6e   struct stat con
35dc0 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e  chInfo;.      in
35dd0 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30  t goLockless = 0
35de0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 73 53  ;..      if( osS
35df0 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  tat(pCtx->conchF
35e00 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63 68 49  ilePath, &conchI
35e10 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20  nfo) == -1 ) {. 
35e20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
35e30 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
35e40 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54  if( (err==ENOENT
35e50 29 20 26 26 20 28 73 74 61 74 66 73 28 64 62 50  ) && (statfs(dbP
35e60 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
35e70 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20   -1) ){.        
35e80 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28    goLockless = (
35e90 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
35ea0 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e  NT_RDONLY) == MN
35eb0 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  T_RDONLY;.      
35ec0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
35ed0 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73    if( goLockless
35ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78   ){.        pCtx
35ef0 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31  ->conchHeld = -1
35f00 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46  ; /* read only F
35f10 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  S/ lockless */. 
35f20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35f30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
35f40 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28     }.  }  .  if(
35f50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
35f60 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  & lockPath ){.  
35f70 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
35f80 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
35f90 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50  bStrDup(0, lockP
35fa0 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ath);.  }..  if(
35fb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35fc0 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61  {.    pCtx->dbPa
35fd0 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
35fe0 72 44 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b  rDup(0, dbPath);
35ff0 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 64  .    if( pCtx->d
36000 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  bPath==NULL ){. 
36010 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
36020 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
36030 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
36040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
36050 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c  all memory is al
36060 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20  located, proxys 
36070 61 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  are created and 
36080 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a  assigned, .    *
36090 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63  * switch the loc
360a0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64  king context and
360b0 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65   pMethod then re
360c0 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  turn..    */.   
360d0 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
360e0 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65  gContext = pFile
360f0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
36100 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ;.    pFile->loc
36110 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
36120 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f  tx;.    pCtx->pO
36130 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65  ldMethod = pFile
36140 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70  ->pMethod;.    p
36150 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
36160 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b  &proxyIoMethods;
36170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
36180 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  ( pCtx->conchFil
36190 65 20 29 7b 20 0a 20 20 20 20 20 20 70 43 74 78  e ){ .      pCtx
361a0 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  ->conchFile->pMe
361b0 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
361c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74  lite3_file *)pCt
361d0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
361e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
361f0 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
36200 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
36210 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
36220 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
36230 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
36240 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
36250 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20  hFilePath); .   
36260 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
36270 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  tx);.  }.  OSTRA
36280 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20  CE(("TRANSPROXY 
36290 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65   %d %s\n", pFile
362a0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
362b0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
362c0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
362d0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
362e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
362f0 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73   routine handles
36300 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
36310 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68  ntrol() calls th
36320 61 74 20 61 72 65 20 73 70 65 63 69 66 69 63 0a  at are specific.
36330 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b  ** to proxy lock
36340 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
36350 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
36360 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
36370 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
36380 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
36390 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
363a0 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  ase SQLITE_GET_L
363b0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
363c0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
363d0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
363e0 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28  e*)id;.      if(
363f0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
36400 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f  == &proxyIoMetho
36410 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  ds ){.        pr
36420 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
36430 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
36440 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29  LockingContext*)
36450 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
36460 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  ntext;.        p
36470 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46  roxyTakeConch(pF
36480 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ile);.        if
36490 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ( pCtx->lockProx
364a0 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
364b0 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
364c0 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e  **)pArg = pCtx->
364d0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
364e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
364f0 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20          *(const 
36500 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22  char **)pArg = "
36510 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64  :auto: (not held
36520 29 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  )";.        }.  
36530 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
36540 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61       *(const cha
36550 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c  r **)pArg = NULL
36560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
36590 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
365a0 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
365b0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
365c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
365d0 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  id;.      int rc
365e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
365f0 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53      int isProxyS
36600 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70  tyle = (pFile->p
36610 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79  Method == &proxy
36620 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20  IoMethods);.    
36630 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c    if( pArg==NULL
36640 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20   || (const char 
36650 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20  *)pArg==0 ){.   
36660 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79       if( isProxy
36670 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Style ){.       
36680 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70     /* turn off p
36690 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e  roxy locking - n
366a0 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a  ot supported */.
366b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
366c0 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51  QLITE_ERROR /*SQ
366d0 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53  LITE_PROTOCOL? S
366e0 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b  QLITE_MISUSE?*/;
366f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
36700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
36710 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b  n off proxy lock
36720 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66  ing - already of
36730 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20  f - NOOP */.    
36740 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
36750 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
36760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36770 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
36780 2a 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f  *proxyPath = (co
36790 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b  nst char *)pArg;
367a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50  .        if( isP
367b0 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20  roxyStyle ){.   
367c0 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b         proxyLock
367d0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
367e0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
367f0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
36800 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  text*)pFile->loc
36810 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
36820 20 20 20 20 20 20 20 69 66 28 20 21 73 74 72 63         if( !strc
36830 6d 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a  mp(pArg, ":auto:
36840 22 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ") .           |
36850 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  | (pCtx->lockPro
36860 78 79 50 61 74 68 20 26 26 0a 20 20 20 20 20 20  xyPath &&.      
36870 20 20 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d           !strncm
36880 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  p(pCtx->lockProx
36890 79 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68  yPath, proxyPath
368a0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20  , MAXPATHLEN)). 
368b0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
368c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
368d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
368e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
368f0 20 20 20 20 20 72 63 20 3d 20 73 77 69 74 63 68       rc = switch
36900 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46  LockProxyPath(pF
36910 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ile, proxyPath);
36920 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36940 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e        /* turn on
36950 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   proxy file lock
36960 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ing */.         
36970 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73   rc = proxyTrans
36980 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69  formUnixFile(pFi
36990 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  le, proxyPath);.
369a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
369b0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
369c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  c;.    }.    def
369d0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
369e0 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54  sert( 0 );  /* T
369f0 68 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20  he call assures 
36a00 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20  that only valid 
36a10 6f 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74  opcodes are sent
36a20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
36a30 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
36a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
36a50 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  RROR;.}../*.** W
36a60 69 74 68 69 6e 20 74 68 69 73 20 64 69 76 69 73  ithin this divis
36a70 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e  ion (the proxyin
36a80 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  g locking implem
36a90 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72  entation) the pr
36aa0 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76  ocedures.** abov
36ab0 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65  e this point are
36ac0 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20   all utilities. 
36ad0 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65   The lock-relate
36ae0 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  d methods of the
36af0 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  .** proxy-lockin
36b00 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  g sqlite3_io_met
36b10 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f  hod object follo
36b20 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  w..*/.../*.** Th
36b30 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
36b40 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
36b50 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
36b60 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
36b70 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
36b80 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
36b90 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
36ba0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
36bb0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
36bc0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
36bd0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
36be0 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
36bf0 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
36c00 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
36c10 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
36c20 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
36c30 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
36c40 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
36c50 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
36c60 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
36c70 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
36c80 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
36c90 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78  ResOut) {.  unix
36ca0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
36cb0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
36cc0 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
36cd0 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
36ce0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36cf0 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
36d00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
36d10 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36d20 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36d30 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36d40 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
36d50 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
36d60 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
36d70 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
36d80 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
36d90 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d  return proxy->pM
36da0 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73  ethod->xCheckRes
36db0 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74  ervedLock((sqlit
36dc0 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20  e3_file*)proxy, 
36dd0 70 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65  pResOut);.    }e
36de0 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c  lse{ /* conchHel
36df0 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73  d < 0 is lockles
36e00 73 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 4f  s */.      pResO
36e10 75 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut=0;.    }.  }.
36e20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36e30 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
36e40 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
36e50 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
36e60 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
36e70 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
36e80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
36e90 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
36ea0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
36eb0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
36ec0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
36ed0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
36ee0 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
36ef0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
36f00 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
36f10 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
36f20 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
36f30 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
36f40 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
36f50 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
36f60 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
36f70 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
36f80 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
36f90 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
36fa0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
36fb0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
36fc0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
36fd0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
36fe0 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
36ff0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
37000 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
37010 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
37020 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
37030 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
37040 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
37050 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
37060 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
37070 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
37080 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
37090 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
370a0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
370b0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
370c0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
370d0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
370e0 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
370f0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
37100 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
37110 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
37120 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
37130 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
37140 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
37150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37160 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33  roxyLock(sqlite3
37170 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
37180 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
37190 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
371a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
371b0 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
371c0 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
371d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
371e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
371f0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37200 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
37210 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
37220 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
37230 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  text;.    if( pC
37240 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
37250 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  ){.      unixFil
37260 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d  e *proxy = pCtx-
37270 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
37280 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d    rc = proxy->pM
37290 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
372a0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
372b0 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  y, eFileLock);. 
372c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
372d0 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65  eLock = proxy->e
372e0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65  FileLock;.    }e
372f0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f  lse{.      /* co
37300 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
37310 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d  ockless */.    }
37320 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
37330 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
37340 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
37350 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
37360 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
37370 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
37380 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
37390 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
373a0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
373b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
373c0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
373d0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
373e0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
373f0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
37400 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
37410 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
37420 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
37430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37440 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69  proxyUnlock(sqli
37450 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
37460 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
37470 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
37480 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
37490 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f  ;.  int rc = pro
374a0 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
374b0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
374c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
374d0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
374e0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
374f0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37500 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
37510 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28  Context;.    if(
37520 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
37530 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78  >0 ){.      unix
37540 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43  File *proxy = pC
37550 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
37560 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d       rc = proxy-
37570 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
37580 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
37590 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63  )proxy, eFileLoc
375a0 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  k);.      pFile-
375b0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f  >eFileLock = pro
375c0 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  xy->eFileLock;. 
375d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
375e0 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
375f0 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
37600 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
37610 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37620 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61  Close a file tha
37630 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63  t uses proxy loc
37640 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ks..*/.static in
37650 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
37660 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
37670 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
37680 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
37690 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
376a0 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ;.    proxyLocki
376b0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
376c0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
376d0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
376e0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
376f0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f      unixFile *lo
37700 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e  ckProxy = pCtx->
37710 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75  lockProxy;.    u
37720 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
37730 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
37740 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72 63  File;.    int rc
37750 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37760 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50    .    if( lockP
37770 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
37780 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
37790 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
377a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f  sqlite3_file*)lo
377b0 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b  ckProxy, NO_LOCK
377c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
377d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
377e0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78     rc = lockProx
377f0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  y->pMethod->xClo
37800 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
37810 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  *)lockProxy);.  
37820 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
37830 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
37840 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50  lite3_free(lockP
37850 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43 74  roxy);.      pCt
37860 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30  x->lockProxy = 0
37870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
37880 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20 20  conchFile ){.   
37890 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
378a0 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20 20  chHeld ){.      
378b0 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c 65    rc = proxyRele
378c0 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  aseConch(pFile);
378d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
378e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
378f0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
37900 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
37910 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
37920 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
37930 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
37940 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
37950 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
37960 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  ee(conchFile);. 
37970 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
37980 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
37990 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
379a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
379b0 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
379c0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
379d0 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78  e3DbFree(0, pCtx
379e0 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20 2f  ->dbPath);.    /
379f0 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f 72  * restore the or
37a00 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63  iginal locking c
37a10 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68  ontext and pMeth
37a20 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74  od then close it
37a30 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   */.    pFile->l
37a40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
37a50 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67  pCtx->oldLocking
37a60 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69  Context;.    pFi
37a70 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43  le->pMethod = pC
37a80 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a  tx->pOldMethod;.
37a90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
37aa0 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75  (pCtx);.    retu
37ab0 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  rn pFile->pMetho
37ac0 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20  d->xClose(id);. 
37ad0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
37ae0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64  TE_OK;.}....#end
37af0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
37b00 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
37b10 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
37b20 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
37b30 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
37b40 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e 74 65  ng style is inte
37b50 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69 74  nded for use wit
37b60 68 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  h AFP filesystem
37b70 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20  s..** And since 
37b80 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75 70 70  AFP is only supp
37b90 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c  orted on MacOSX,
37ba0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   the proxy locki
37bb0 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65  ng is also.** re
37bc0 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61 63 4f  stricted to MacO
37bd0 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  SX..** .**.*****
37be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
37bf0 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  nd of the proxy 
37c00 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
37c10 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
37c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
37c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
37c80 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
37c90 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
37ca0 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  m interface..**.
37cb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
37cc0 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46  registers all VF
37cd0 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
37ce0 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20  s for unix-like 
37cf0 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73  operating.** sys
37d00 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74  tems.  This rout
37d10 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c  ine, and the sql
37d20 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f  ite3_os_end() ro
37d30 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f  utine that follo
37d40 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65  ws,.** should be
37d50 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e   the only routin
37d60 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  es in this file 
37d70 74 68 61 74 20 61 72 65 20 76 69 73 69 62 6c 65  that are visible
37d80 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66   from other.** f
37d90 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  iles..**.** This
37da0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
37db0 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53  ed once during S
37dc0 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61  QLite initializa
37dd0 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a  tion and by a.**
37de0 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20   single thread. 
37df0 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   The memory allo
37e00 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78  cation and mutex
37e10 20 73 75 62 73 79 73 74 65 6d 73 20 68 61 76 65   subsystems have
37e20 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72   not.** necessar
37e30 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ily been initial
37e40 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 72  ized when this r
37e50 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
37e60 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a  , and so they.**
37e70 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75   should not be u
37e80 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
37e90 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64  te3_os_init(void
37ea0 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54  ){ .  /* .  ** T
37eb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
37ec0 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e  ro defines an in
37ed0 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e  itializer for an
37ee0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
37ef0 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61  ect..  ** The na
37f00 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 69 73  me of the VFS is
37f10 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70   NAME.  The pApp
37f20 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65  Data is a pointe
37f30 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20  r to a pointer. 
37f40 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64   ** to the "find
37f50 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28  er" function.  (
37f60 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70 6f  pAppData is a po
37f70 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74  inter to a point
37f80 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  er because.  ** 
37f90 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20  silly C90 rules 
37fa0 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a  prohibit a void*
37fb0 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74   from being cast
37fc0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70   to a function p
37fd0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20  ointer.  ** and 
37fe0 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f  so we have to go
37ff0 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74   through the int
38000 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65  ermediate pointe
38010 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
38020 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f  ems.  ** when co
38030 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 65  mpiling with -pe
38040 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e  dantic-errors on
38050 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a   GCC.).  **.  **
38060 20 54 68 65 20 46 49 4e 44 45 52 20 70 61 72 61   The FINDER para
38070 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 6d 61  meter to this ma
38080 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  cro is the name 
38090 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  of the pointer t
380a0 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65  o the.  ** finde
380b0 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  r-function.  The
380c0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
380d0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
380e0 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73  er to the.  ** s
380f0 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73  qlite_io_methods
38100 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
38110 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69  lements the desi
38120 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  red locking.  **
38130 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65   behaviors.  See
38140 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62   the division ab
38150 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ove that contain
38160 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a  s the IOMETHODS.
38170 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61    ** macro for a
38180 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  ddition informat
38190 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75  ion on finder-fu
381a0 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20  nctions..  **.  
381b0 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20  ** Most finders 
381c0 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20  simply return a 
381d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
381e0 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
381f0 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63  thods.  ** objec
38200 74 2e 20 20 42 75 74 20 74 68 65 20 22 61 75 74  t.  But the "aut
38210 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20 61  olockIoFinder" a
38220 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
38230 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74 6c 65  SX does a little
38240 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  .  ** more than 
38250 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61  that; it looks a
38260 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
38270 20 74 79 70 65 20 74 68 61 74 20 68 6f 73 74 73   type that hosts
38280 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
38290 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 72 69  ase file and tri
382a0 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20  es to choose an 
382b0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61  locking method a
382c0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 20  ppropriate for. 
382d0 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73 79 73   ** that filesys
382e0 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  tem time..  */. 
382f0 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53   #define UNIXVFS
38300 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52  (VFSNAME, FINDER
38310 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
38320 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
38330 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
38340 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
38350 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  on */           
38360 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73           \.    s
38370 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c  izeof(unixFile),
38380 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
38390 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
383a0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58         \.    MAX
383b0 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20  _PATHNAME,      
383c0 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65     /* mxPathname
383d0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
383e0 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20       \.    0,   
383f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38400 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20   /* pNext */    
38410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38420 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45     \.    VFSNAME
38430 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
38440 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20  * zName */      
38450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38460 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29 26 46   \.    (void*)&F
38470 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f 2a 20  INDER,       /* 
38480 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20  pAppData */     
38490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
384a0 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20  .    unixOpen,  
384b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
384c0 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  pen */          
384d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
384e0 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20     unixDelete,  
384f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
38500 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ete */          
38510 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
38520 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20   unixAccess,    
38530 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
38540 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
38550 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
38560 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  nixFullPathname,
38570 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
38580 68 6e