/ Hex Artifact Content
Login

Artifact 32f2ac2adbbba6acb649915a6953524ecf4cf9d5:


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 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
12c0: 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20  UTIME.# include 
12d0: 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66  <utime.h>.#endif
12e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
12f0: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
1300: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
1310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
1320: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
1330: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
1340: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
1350: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
1360: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
1370: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1380: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1390: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
13a0: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
13b0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
13c0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
13d0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
13e0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
13f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1400: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1410: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1420: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
1430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1450: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1460: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1470: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1480: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1490: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
14a0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14b0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14c0: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
14d0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14e0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14f0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1500: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1510: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1520: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1530: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1540: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1550: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1560: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1570: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1580: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1590: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15a0: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
15b0: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
15c0: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
15d0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
15e0: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
15f0: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
1600: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
1610: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
1620: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
1630: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20  LITE_BUSY))../* 
1640: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1650: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
1670: 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xShm;           
1680: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1690: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
16a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16b0: 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e  t unixShmNode un
16c0: 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  ixShmNode;      
16d0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
16e0: 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79  y instance */.ty
16f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1700: 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49  xInodeInfo unixI
1710: 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41  nodeInfo;   /* A
1720: 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65  n i-node */.type
1730: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1740: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1750: 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20  edFd;     /* An 
1760: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1770: 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  riptor */../*.**
1780: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
1790: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
17a0: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
17b0: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
17c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
17d0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
17e0: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
17f0: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
1800: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
1810: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1820: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1830: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
1840: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
1850: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
1860: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
1870: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
1880: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  euse it..*/.stru
1890: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
18a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
18d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
18e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
18f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1900: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1910: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1920: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1930: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1950: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1960: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1970: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1980: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1990: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
19a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
19b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
19c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
19d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
19e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1a00: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1a10: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1a20: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1a30: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1a40: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1a50: 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49  entry */.  unixI
1a60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a80: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1a90: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1aa0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ae0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1af0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b10: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b20: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b40: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b50: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b60: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b70: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1b80: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bb0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1bc0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bd0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1be0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1bf0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c00: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c10: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c20: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c50: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c70: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c90: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1ca0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cd0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1ce0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1cf0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d20: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d30: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d50: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d80: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1d90: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1da0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1db0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dc0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1dd0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1de0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e10: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e20: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e40: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e70: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e80: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1e90: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ea0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1eb0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ec0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ed0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ee0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1ef0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f00: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f10: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f20: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f30: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f50: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f60: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f70: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f80: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1f90: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fa0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fb0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fc0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fd0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1fe0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1ff0: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2000: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2010: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2020: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2030: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2040: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2050: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2060: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2070: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2080: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20a0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20b0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20c0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20d0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20e0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
20f0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2100: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2110: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2120: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2130: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2140: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2160: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2170: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2180: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
2190: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21a0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21c0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21d0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21e0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
21f0: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2200: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2210: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2220: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2230: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2240: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2250: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2260: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2270: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2280: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2290: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22a0: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
22b0: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
22c0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
22d0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
22e0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
22f0: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2300: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2310: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
2320: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2330: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
2340: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2350: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
2360: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
2370: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
2380: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2390: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
23c0: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
23d0: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
23e0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
23f0: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
2400: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
2410: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
2420: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
2430: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
2440: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
2450: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2460: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
2480: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
2490: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
24a0: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
24b0: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
24c0: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
24d0: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
24e0: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
24f0: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
2500: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
2510: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2520: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
2530: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
2540: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
2550: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
2560: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2570: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2580: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2590: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
25a0: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
25b0: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
25c0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
25d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
25e0: 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73  fferent Unix sys
25f0: 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65  tems declare ope
2600: 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74  n() in different
2610: 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65   ways.  Same use
2620: 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  .** open(const c
2630: 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29  har*,int,mode_t)
2640: 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70  .  Others use op
2650: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
2660: 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20  nt,...)..** The 
2670: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d  difference is im
2680: 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69  portant when usi
2690: 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
26a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
26b0: 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77  .** The safest w
26c0: 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ay to deal with 
26d0: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
26e0: 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69  o always use thi
26f0: 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69  s wrapper.** whi
2700: 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  ch always has th
2710: 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69  e same well-defi
2720: 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ned interface..*
2730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
2740: 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  ixOpen(const cha
2750: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c  r *zFile, int fl
2760: 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a  ags, int mode){.
2770: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46    return open(zF
2780: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65  ile, flags, mode
2790: 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  );.}../* Forward
27a0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
27b0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
27c0: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
27d0: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a  r*, int*);../*.*
27e0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
27f0: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2800: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2810: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2820: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2830: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2840: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2850: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2860: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2870: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2880: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2890: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
28a0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
28b0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
28c0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
28d0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
28e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
28f0: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2900: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2910: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2920: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2930: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2940: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2950: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2960: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2970: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2980: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2990: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
29a0: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
29b0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
29c0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
29d0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
29e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
29f0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2a00: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2a10: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2a20: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2a30: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2a40: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2a50: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2a60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2a70: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2a80: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2a90: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
2aa0: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
2ab0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2ac0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
2ad0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2ae0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
2af0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2b00: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2b10: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2b20: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2b30: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2b40: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2b50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2b60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2b70: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2b80: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2b90: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2ba0: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2bb0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2bc0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2bd0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2be0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2bf0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2c00: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2c10: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2c20: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2c30: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2c40: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2c50: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2c60: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2c70: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2c80: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2c90: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2ca0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2cb0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2cc0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2cd0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2ce0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2cf0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2d00: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
2d10: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
2d20: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
2d30: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
2d40: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
2d50: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
2d60: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2d70: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2d80: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
2d90: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
2da0: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
2db0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
2dc0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2dd0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
2de0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
2df0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
2e00: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2e10: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
2e20: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
2e30: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
2e40: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
2e50: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2e60: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
2e70: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2e80: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
2e90: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
2ea0: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
2eb0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
2ec0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
2ed0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2ee0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
2ef0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
2f00: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
2f10: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
2f20: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
2f30: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
2f40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2f50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
2f60: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2f70: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
2f80: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
2f90: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
2fa0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2fb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2fc0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
2fd0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2fe0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2ff0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
3000: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3010: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
3020: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3030: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3040: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3050: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3060: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3070: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3080: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3090: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
30a0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
30b0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
30c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
30d0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
30e0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
30f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3100: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3110: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3120: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3130: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3140: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3150: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3160: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3170: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3180: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3190: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
31a0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
31b0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
31c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31d0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
31e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
31f0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
3200: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3210: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3220: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3230: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3240: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3250: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3260: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3270: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3280: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3290: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
32a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
32b0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
32c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
32d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
32e0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
32f0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3300: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3310: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3320: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3330: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3340: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3350: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3360: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3370: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3380: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3390: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
33a0: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
33b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
33c0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
33d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
33e0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
33f0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3400: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3410: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3420: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3430: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3460: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3470: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3480: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
3490: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
34a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
34b0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
34c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
34d0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (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 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3520: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3530: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3550: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3560: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3570: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3580: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3590: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
35a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35b0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
35c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
35d0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
35e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
35f0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3600: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3610: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3620: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3630: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3640: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3650: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
3660: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
3670: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3680: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
3690: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
36a0: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
36b0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
36c0: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
36d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
36e0: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
36f0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3700: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
3710: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
3720: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
3730: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
3740: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3750: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
3760: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3770: 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20   "mkdir",       
3780: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3790: 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20  l_ptr)mkdir,    
37a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
37b0: 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20  ine osMkdir     
37c0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
37d0: 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79  har*,mode_t))aSy
37e0: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
37f0: 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22  nt)..  { "rmdir"
3800: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3810: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d  3_syscall_ptr)rm
3820: 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30  dir,           0
3830: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d   },.#define osRm
3840: 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29  dir     ((int(*)
3850: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3860: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
3870: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
3880: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
3890: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
38a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
38b0: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
38c0: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
38d0: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
38e0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
38f0: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
3900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3910: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
3920: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
3930: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
3940: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
3950: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
3960: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
3970: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
3980: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
3990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
39a0: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
39b0: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
39c0: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
39d0: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
39e0: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
39f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3a00: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
3a10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
3a20: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
3a30: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
3a40: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3a50: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
3a60: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
3a70: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
3a80: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
3a90: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
3aa0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3ab0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3ac0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
3ad0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
3ae0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
3af0: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
3b00: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
3b10: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
3b20: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
3b30: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
3b40: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
3b50: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
3b60: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
3b70: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
3b80: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
3b90: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
3ba0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
3bb0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
3bc0: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
3bd0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
3be0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3bf0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
3c00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3c10: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
3c20: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
3c30: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
3c40: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
3c50: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
3c60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
3c70: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3c80: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3c90: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3ca0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
3cb0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
3cc0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
3cd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
3ce0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3cf0: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
3d00: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
3d10: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
3d20: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
3d30: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
3d40: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3d50: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
3d60: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
3d70: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
3d80: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
3d90: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3da0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
3db0: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
3dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3dd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3de0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3df0: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
3e00: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
3e10: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
3e20: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
3e30: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
3e40: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
3e50: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
3e60: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
3e70: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
3e80: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
3e90: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
3ea0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3eb0: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
3ec0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
3ed0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
3ee0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3ef0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
3f00: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
3f10: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
3f20: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
3f30: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
3f40: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
3f50: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
3f60: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
3f70: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
3f80: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
3f90: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
3fa0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
3fb0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3fc0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
3fd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
3fe0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
3ff0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
4000: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
4010: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
4020: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
4030: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
4040: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
4050: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
4060: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
4070: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
4080: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
4090: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
40a0: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
40b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
40c0: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
40d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
40e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
40f0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
4100: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4110: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
4120: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
4130: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
4140: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
4150: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
4160: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4170: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4180: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
4190: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
41a0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
41b0: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
41c0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
41d0: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
41e0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
41f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
4200: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4210: 2a 20 52 65 74 72 79 20 6f 70 65 6e 28 29 20 63  * Retry open() c
4220: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
4230: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73  ue to EINTR.*/.s
4240: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4250: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
4260: 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e 74 20   *z, int f, int 
4270: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
4280: 64 6f 7b 20 72 63 20 3d 20 6f 73 4f 70 65 6e 28  do{ rc = osOpen(
4290: 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c 65 28 20  z,f,m); }while( 
42a0: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
42b0: 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
42c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65   rc;.}../*.** He
42d0: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
42e0: 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
42f0: 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
4300: 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
4310: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
4320: 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
4330: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
4340: 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b  fo and.** vxwork
4350: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20  sFileId objects 
4360: 75 73 65 64 20 62 79 20 74 68 69 73 20 66 69 6c  used by this fil
4370: 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
4380: 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65  may be .** share
4390: 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
43a0: 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
43b0: 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48  ction unixMutexH
43c0: 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
43d0: 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
43e0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
43f0: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
4400: 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
4410: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
4420: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
4430: 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
4440: 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
4450: 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  *.**   unixEnter
4460: 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61  Mutex().**     a
4470: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
4480: 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75  Held() );.**   u
4490: 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a  nixEnterLeave().
44a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
44b0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  nixEnterMutex(vo
44c0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
44d0: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
44e0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
44f0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
4500: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
4510: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
4520: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
4530: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4540: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
4550: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
4560: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
4570: 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  R));.}.#ifdef SQ
4580: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
4590: 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48  c int unixMutexH
45a0: 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
45b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
45c0: 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
45d0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
45e0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
45f0: 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
4600: 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ...#if defined(S
4610: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
4620: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
4630: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  BUG)./*.** Helpe
4640: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70  r function for p
4650: 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63  rinting out trac
4660: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
4670: 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  om debugging.** 
4680: 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72  binaries. This r
4690: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
46a0: 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20  g represetation 
46b0: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
46c0: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
46d0: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
46e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
46f0: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
4700: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
4710: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
4720: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
4730: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
4740: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
4750: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
4760: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
4770: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
4780: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
4790: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
47a0: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
47b0: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
47c0: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
47d0: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
47e0: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
47f0: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
4800: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
4810: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
4820: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
4830: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
4840: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
4850: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
4860: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4870: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
4880: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
4890: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
48a0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
48b0: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
48c0: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
48d0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
48e0: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
48f0: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
4900: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
4910: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
4920: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
4930: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
4940: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
4950: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
4960: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
4970: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
4980: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
4990: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
49a0: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
49b0: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
49c0: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
49d0: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
49e0: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
49f0: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
4a00: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
4a10: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
4a20: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4a30: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
4a40: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
4a50: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
4a60: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
4a70: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
4a80: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
4a90: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
4aa0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
4ab0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
4ac0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
4ad0: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
4ae0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
4af0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
4b00: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
4b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
4b20: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
4b30: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
4b40: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
4b50: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
4b60: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
4b70: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
4b80: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4b90: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
4ba0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
4bb0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
4bc0: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
4bd0: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
4be0: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
4bf0: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
4c00: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
4c10: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
4c20: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
4c30: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
4c40: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
4c50: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
4c60: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
4c70: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
4c80: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
4c90: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
4ca0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
4cb0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4cc0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
4cd0: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
4ce0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4cf0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
4d00: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
4d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4d20: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
4d30: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4d40: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
4d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
4d60: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
4d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4d80: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
4d90: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
4da0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
4db0: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
4dc0: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
4dd0: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
4de0: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
4df0: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
4e00: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
4e10: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
4e20: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
4e30: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
4e40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
4e50: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
4e60: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
4e70: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
4e80: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
4e90: 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  TR.*/.static int
4ea0: 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
4eb0: 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33  e(int h, sqlite3
4ec0: 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e  _int64 sz){.  in
4ed0: 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
4ee0: 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73   osFtruncate(h,s
4ef0: 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  z); }while( rc<0
4f00: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
4f10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
4f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4f30: 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65  outine translate
4f40: 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53  s a standard POS
4f50: 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e  IX errno code in
4f60: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
4f70: 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c  useful to the cl
4f80: 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c  ients of the sql
4f90: 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ite3 functions. 
4fa0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69   Specifically, i
4fb0: 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64  t is.** intended
4fc0: 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20   to translate a 
4fd0: 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20  variety of "try 
4fe0: 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e  again" errors in
4ff0: 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a  to SQLITE_BUSY.*
5000: 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20  * and a variety 
5010: 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65  of "please close
5020: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
5030: 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73  ptor NOW" errors
5040: 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45   into .** SQLITE
5050: 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72  _IOERR.** .** Er
5060: 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74  rors during init
5070: 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f  ialization of lo
5080: 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73  cks, or file sys
5090: 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20  tem support for 
50a0: 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64  locks,.** should
50b0: 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20   handle ENOLCK, 
50c0: 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53  ENOTSUP, EOPNOTS
50d0: 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  UPP separately..
50e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
50f0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
5100: 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69  ixError(int posi
5110: 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69  xError, int sqli
5120: 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69  teIOErr) {.  swi
5130: 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29  tch (posixError)
5140: 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74   {.#if 0.  /* At
5150: 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20   one point this 
5160: 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d  code was not com
5170: 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74  mented out. In t
5180: 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e  heory, this bran
5190: 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  ch.  ** should n
51a0: 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73 20  ever be hit, as 
51b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
51c0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
51d0: 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61  led after.  ** a
51e0: 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64   locking-related
51f0: 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20   function (i.e. 
5200: 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74  fcntl()) has ret
5210: 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77  urned non-zero w
5220: 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  ith.  ** the val
5230: 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74  ue of errno as t
5240: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5250: 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74 65  t. Since a syste
5260: 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65  m call has faile
5270: 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68  d,.  ** errno sh
5280: 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  ould be non-zero
5290: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70  ..  **.  ** Desp
52a0: 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72 72  ite this, if err
52b0: 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72  no really is zer
52c0: 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27  o, we still don'
52d0: 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e  t want to return
52e0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  .  ** SQLITE_OK.
52f0: 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   The system call
5300: 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f   failed, and *so
5310: 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72  me* SQLite error
5320: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20   should be.  ** 
5330: 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20  propagated back 
5340: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43  to the caller. C
5350: 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62  ommenting this b
5360: 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20  ranch out means 
5370: 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69  errno==0.  ** wi
5380: 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  ll be handled by
5390: 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20   the "default:" 
53a0: 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  case below..  */
53b0: 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20  .  case 0: .    
53c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
53d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65  ;.#endif..  case
53e0: 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20   EAGAIN:.  case 
53f0: 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73  ETIMEDOUT:.  cas
5400: 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20  e EBUSY:.  case 
5410: 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e  EINTR:.  case EN
5420: 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72  OLCK:  .    /* r
5430: 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20  andom NFS retry 
5440: 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75  error, unless du
5450: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
5460: 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a   support .     *
5470: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
5480: 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75  in which it actu
5490: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
54a0: 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72  it says */.    r
54b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
54c0: 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  Y;.    .  case E
54d0: 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45  ACCES: .    /* E
54e0: 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41  ACCES is like EA
54f0: 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b  GAIN during lock
5500: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20  ing operations, 
5510: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65  but not any othe
5520: 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28  r time*/.    if(
5530: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
5540: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
5550: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
5560: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5570: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c  IOERR_UNLOCK) ||
5580: 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20   ..(sqliteIOErr 
5590: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
55a0: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c  RDLOCK) ||..(sql
55b0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
55c0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
55d0: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20  SERVEDLOCK) ){. 
55e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
55f0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
5600: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20     /* else fall 
5610: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73  through */.  cas
5620: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
5630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
5640: 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41  ;.    .  /* EDEA
5650: 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DLK is only poss
5660: 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74  ible if a call t
5670: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57  o fcntl(F_SETLKW
5680: 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20  ) is made. And. 
5690: 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20   ** this module 
56a0: 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68  never makes such
56b0: 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65   a call. And the
56c0: 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20   code in SQLite 
56d0: 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73  itself .  ** ass
56e0: 65 72 74 73 20 74 68 61 74 20 53 51 4c 49 54 45  erts that SQLITE
56f0: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69  _IOERR_BLOCKED i
5700: 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64  s never returned
5710: 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65 61 73  . For these reas
5720: 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  ons.  ** this ca
5730: 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65  se is also comme
5740: 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65  nted out. If the
5750: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74   system does set
5760: 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c   errno to EDEADL
5770: 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61  K,.  ** the defa
5780: 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ult SQLITE_IOERR
5790: 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62  _XXX code will b
57a0: 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23  e returned. */.#
57b0: 69 66 20 30 0a 20 20 63 61 73 65 20 45 44 45 41  if 0.  case EDEA
57c0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
57d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
57e0: 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20  CKED;.#endif.   
57f0: 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50   .#if EOPNOTSUPP
5800: 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  !=ENOTSUP.  case
5810: 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20   EOPNOTSUPP: .  
5820: 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77    /* something w
5830: 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72  ent terribly awr
5840: 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  y, unless during
5850: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
5860: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
5870: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
5880: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
5890: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
58a0: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ays */.#endif.#i
58b0: 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63  fdef ENOTSUP.  c
58c0: 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20  ase ENOTSUP: .  
58d0: 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c    /* invalid fd,
58e0: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
58f0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
5900: 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  rt introspection
5910: 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20  , in which .    
5920: 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d   * it actually m
5930: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
5940: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61  s */.#endif.  ca
5950: 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45  se EIO:.  case E
5960: 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e  BADF:.  case EIN
5970: 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54  VAL:.  case ENOT
5980: 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f  CONN:.  case ENO
5990: 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49  DEV:.  case ENXI
59a0: 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54  O:.  case ENOENT
59b0: 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20  :.#ifdef ESTALE 
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73      /* ESTALE is
59e0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20   not defined on 
59f0: 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20  Interix systems 
5a00: 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  */.  case ESTALE
5a10: 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  :.#endif.  case 
5a20: 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74  ENOSYS:.    /* t
5a30: 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63  hese should forc
5a40: 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20  e the client to 
5a50: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61  close the file a
5a60: 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a  nd reconnect */.
5a70: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
5a80: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
5a90: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
5aa0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
5ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5af0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
5b00: 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75  **** Begin Uniqu
5b10: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
5b20: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
5b30: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
5b40: 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20  *.**.** On most 
5b50: 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78  versions of unix
5b60: 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75  , we can get a u
5b70: 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66  nique ID for a f
5b80: 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61  ile by concatena
5b90: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69  ting.** the devi
5ba0: 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ce number and th
5bb0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
5bc0: 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e   But this does n
5bd0: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
5be0: 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b  ks..** On VxWork
5bf0: 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  s, a unique file
5c00: 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65   id must be base
5c10: 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63  d on the canonic
5c20: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a  al filename..**.
5c30: 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
5c40: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
5c50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5c60: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73  ucture can be us
5c70: 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75  ed as a.** uniqu
5c80: 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57  e file ID in VxW
5c90: 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74  orks.  Each inst
5ca0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
5cb0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
5cc0: 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ** a copy of the
5cd0: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
5ce0: 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61  ame.  There is a
5cf0: 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20  lso a reference 
5d00: 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20  count.  .** The 
5d10: 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63  structure is rec
5d20: 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20  laimed when the 
5d30: 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  number of pointe
5d40: 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74  rs to it drops t
5d50: 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  o.** zero..**.**
5d60: 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72   There are never
5d70: 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73   very many files
5d80: 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d   open at one tim
5d90: 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72  e and lookups ar
5da0: 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f  e not.** a perfo
5db0: 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20  rmance-critical 
5dc0: 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73  path, so it is s
5dd0: 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74  ufficient to put
5de0: 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74   these.** struct
5df0: 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  ures on a linked
5e00: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74   list..*/.struct
5e10: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b   vxworksFileId {
5e20: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
5e30: 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20  sFileId *pNext; 
5e40: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69   /* Next in a li
5e50: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a  st of them all *
5e60: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
5e90: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
5ea0: 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  s one */.  int n
5eb0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
5ed0: 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e  th of the zCanon
5ee0: 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e  icalName[] strin
5ef0: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61  g */.  char *zCa
5f00: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20  nonicalName;    
5f10: 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61       /* Canonica
5f20: 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b  l filename */.};
5f30: 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
5f40: 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71  ./* .** All uniq
5f50: 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ue filenames are
5f60: 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65   held on a linke
5f70: 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79  d list headed by
5f80: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c   this.** variabl
5f90: 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  e:.*/.static str
5fa0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
5fb0: 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  d *vxworksFileLi
5fc0: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
5fd0: 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61  implify a filena
5fe0: 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f  me into its cano
5ff0: 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79  nical form.** by
6000: 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c   making the foll
6010: 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a  owing changes:.*
6020: 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67  *.**  * removing
6030: 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e   any trailing an
6040: 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a  d duplicate /.**
6050: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20    * convert /./ 
6060: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20  into just /.**  
6070: 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f  * convert /A/../
6080: 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20   where A is any 
6090: 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f  simple name into
60a0: 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68   just /.**.** Ch
60b0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
60c0: 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e  n-place.  Return
60d0: 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65   the new name le
60e0: 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ngth..**.** The 
60f0: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
6100: 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31  e is in z[0..n-1
6110: 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ].  Return the n
6120: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72  umber of.** char
6130: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69  acters in the si
6140: 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a  mplified name..*
6150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77  /.static int vxw
6160: 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65  orksSimplifyName
6170: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29  (char *z, int n)
6180: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
6190: 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b  while( n>1 && z[
61a0: 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d  n-1]=='/' ){ n--
61b0: 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ; }.  for(i=j=0;
61c0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
61d0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b  if( z[i]=='/' ){
61e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
61f0: 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='/' ) continu
6200: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  e;.      if( z[i
6210: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c  +1]=='.' && i+2<
6220: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27  n && z[i+2]=='/'
6230: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d   ){.        i +=
6240: 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   1;.        cont
6250: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
6260: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6270: 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20  '.' && i+3<n && 
6280: 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a  z[i+2]=='.' && z
6290: 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+3]=='/' ){.  
62a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
62b0: 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20   && z[j-1]!='/' 
62c0: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
62d0: 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d    if( j>0 ){ j--
62e0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d  ; }.        i +=
62f0: 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   2;.        cont
6300: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
6310: 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d    }.    z[j++] =
6320: 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a   z[i];.  }.  z[j
6330: 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
6340: 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  j;.}../*.** Find
6350: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49   a unique file I
6360: 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  D for the given 
6370: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d  absolute pathnam
6380: 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  e.  Return.** a 
6390: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76  pointer to the v
63a0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
63b0: 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74  ect.  This point
63c0: 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65  er is the unique
63d0: 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a  .** file ID..**.
63e0: 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c  ** The nRef fiel
63f0: 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73  d of the vxworks
6400: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73  FileId object is
6410: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66   incremented bef
6420: 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ore.** the objec
6430: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  t is returned.  
6440: 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c  A new vxworksFil
6450: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72  eId object is cr
6460: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64  eated.** and add
6470: 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c  ed to the global
6480: 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61   list if necessa
6490: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  ry..**.** If a m
64a0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
64b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
64c0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
64d0: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
64e0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
64f0: 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f  rksFindFileId(co
6500: 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c  nst char *zAbsol
6510: 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75  uteName){.  stru
6520: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6530: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
6540: 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e  /* search key an
6550: 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  d new file ID */
6560: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
6570: 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64  sFileId *pCandid
6580: 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f  ate;   /* For lo
6590: 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74  oping over exist
65a0: 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a  ing file IDs */.
65b0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
65e0: 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  of zAbsoluteName
65f0: 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73   string */..  as
6600: 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e  sert( zAbsoluteN
6610: 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20  ame[0]=='/' );. 
6620: 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
6630: 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b  (zAbsoluteName);
6640: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
6650: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
6660: 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20  (*pNew) + (n+1) 
6670: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
6680: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
6690: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
66a0: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
66b0: 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  ew[1];.  memcpy(
66c0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
66d0: 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e  Name, zAbsoluteN
66e0: 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d  ame, n+1);.  n =
66f0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
6700: 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  Name(pNew->zCano
6710: 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a  nicalName, n);..
6720: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
6730: 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  an existing entr
6740: 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20  y that matching 
6750: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61  the canonical na
6760: 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e  me..  ** If foun
6770: 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  d, increment the
6780: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6790: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
67a0: 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68  inter to.  ** th
67b0: 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20  e existing file 
67c0: 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ID..  */.  unixE
67d0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66  nterMutex();.  f
67e0: 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78  or(pCandidate=vx
67f0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70  worksFileList; p
6800: 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64  Candidate; pCand
6810: 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65  idate=pCandidate
6820: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
6830: 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e  ( pCandidate->nN
6840: 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20  ame==n .     && 
6850: 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74  memcmp(pCandidat
6860: 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  e->zCanonicalNam
6870: 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  e, pNew->zCanoni
6880: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20  calName, n)==0. 
6890: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c     ){.       sql
68a0: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
68b0: 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61  .       pCandida
68c0: 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  te->nRef++;.    
68d0: 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
68e0: 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75  x();.       retu
68f0: 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20  rn pCandidate;. 
6900: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
6910: 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e  o match was foun
6920: 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65  d.  We will make
6930: 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a   a new file ID *
6940: 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d  /.  pNew->nRef =
6950: 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d   1;.  pNew->nNam
6960: 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = n;.  pNew->p
6970: 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69  Next = vxworksFi
6980: 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b  leList;.  vxwork
6990: 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77  sFileList = pNew
69a0: 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
69b0: 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ex();.  return p
69c0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
69d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
69e0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61  rence count on a
69f0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
6a00: 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20  bject.  Free.** 
6a10: 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20  the object when 
6a20: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
6a30: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
6a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a50: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
6a60: 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77  ileId(struct vxw
6a70: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29  orksFileId *pId)
6a80: 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  {.  unixEnterMut
6a90: 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
6aa0: 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pId->nRef>0 );. 
6ab0: 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pId->nRef--;.  
6ac0: 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30  if( pId->nRef==0
6ad0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76   ){.    struct v
6ae0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70  xworksFileId **p
6af0: 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76  p;.    for(pp=&v
6b00: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
6b10: 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b  *pp && *pp!=pId;
6b20: 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70   pp = &((*pp)->p
6b30: 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73  Next)){}.    ass
6b40: 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b  ert( *pp==pId );
6b50: 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e  .    *pp = pId->
6b60: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
6b70: 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20  e3_free(pId);.  
6b80: 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
6b90: 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ex();.}.#endif /
6ba0: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
6bb0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6bc0: 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46   End of Unique F
6bd0: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
6be0: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
6bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6c50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
6c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ca0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f  ************* Po
6cc0: 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
6cd0: 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cf0: 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64  *.**.** POSIX ad
6d00: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65  visory locks are
6d10: 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67   broken by desig
6d20: 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30  n.  ANSI STD 100
6d30: 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65  3.1 (1996).** se
6d40: 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69  ction 6.5.2.2 li
6d50: 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20  nes 483 through 
6d60: 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74  490 specify that
6d70: 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a   when a process.
6d80: 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72  ** sets or clear
6d90: 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f  s a lock, that o
6da0: 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64  peration overrid
6db0: 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63  es any prior loc
6dc0: 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65  ks set.** by the
6dd0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
6de0: 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c  It does not expl
6df0: 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62  icitly say so, b
6e00: 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a  ut this implies.
6e10: 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72  ** that it overr
6e20: 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62  ides locks set b
6e30: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
6e40: 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65  ss using a diffe
6e50: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
6e60: 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64  criptor.  Consid
6e70: 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73  er this test cas
6e80: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
6e90: 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e  nt fd1 = open(".
6ea0: 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c  /file1", O_RDWR|
6eb0: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
6ec0: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32  **       int fd2
6ed0: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32   = open("./file2
6ee0: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
6ef0: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20  T, 0644);.**.** 
6f00: 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20  Suppose ./file1 
6f10: 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20  and ./file2 are 
6f20: 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  really the same 
6f30: 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a  file (because.**
6f40: 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f   one is a hard o
6f50: 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20  r symbolic link 
6f60: 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68  to the other) th
6f70: 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a  en if you set.**
6f80: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
6f90: 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20  ck on fd1, then 
6fa0: 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78  try to get an ex
6fb0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
6fc0: 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73  on fd2, it works
6fd0: 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20  .  I would have 
6fe0: 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63  expected the sec
6ff0: 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66  ond lock to.** f
7000: 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20  ail since there 
7010: 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f  was already a lo
7020: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64  ck on the file d
7030: 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75  ue to fd1..** Bu
7040: 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65  t not so.  Since
7050: 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65   both locks came
7060: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70   from the same p
7070: 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73  rocess, the.** s
7080: 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20  econd overrides 
7090: 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20  the first, even 
70a0: 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65  though they were
70b0: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   on different.**
70c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
70d0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66  s opened on diff
70e0: 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73  erent file names
70f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61  ..**.** This mea
7100: 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f  ns that we canno
7110: 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b  t use POSIX lock
7120: 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  s to synchronize
7130: 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20   file access.** 
7140: 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20  among competing 
7150: 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73  threads of the s
7160: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f  ame process.  PO
7170: 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77  SIX locks will w
7180: 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73  ork fine.** to s
7190: 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73  ynchronize acces
71a0: 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e  s for threads in
71b0: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
71c0: 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20  ses, but not.** 
71d0: 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74  threads within t
71e0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
71f0: 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61  .**.** To work a
7200: 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65  round the proble
7210: 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f  m, SQLite has to
7220: 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63   manage file loc
7230: 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ks internally.**
7240: 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68   on its own.  Wh
7250: 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74  enever a new dat
7260: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c  abase is opened,
7270: 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64   we have to find
7280: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63   the.** specific
7290: 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61   inode of the da
72a0: 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65  tabase file (the
72b0: 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d   inode is determ
72c0: 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  ined by the.** s
72d0: 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f  t_dev and st_ino
72e0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
72f0: 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68  tat structure th
7300: 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73  at fstat() fills
7310: 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63   in).** and chec
7320: 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65  k for locks alre
7330: 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20  ady existing on 
7340: 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65  that inode.  Whe
7350: 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63  n locks are.** c
7360: 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65  reated or remove
7370: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f  d, we have to lo
7380: 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e  ok at our own in
7390: 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66  ternal record of
73a0: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f   the.** locks to
73b0: 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
73c0: 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69  thread has previ
73d0: 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b  ously set a lock
73e0: 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a   on that same.**
73f0: 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41   inode..**.** (A
7400: 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66  side: The use of
7410: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61   inode numbers a
7420: 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65  s unique IDs doe
7430: 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78  s not work on Vx
7440: 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78  Works..** For Vx
7450: 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74  Works, we have t
7460: 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e  o use the altern
7470: 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20  ative unique ID 
7480: 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a  system based on.
7490: 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  ** canonical fil
74a0: 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d  ename and implem
74b0: 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65  ented in the pre
74c0: 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29  vious division.)
74d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
74e0: 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
74f0: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
7500: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
7510: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
7520: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
7530: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
7540: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
7550: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
7560: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
7570: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
7580: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7590: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
75a0: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
75b0: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
75c0: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
75d0: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
75e0: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
75f0: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
7600: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
7610: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
7620: 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74  both unixFile st
7630: 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e  ructures.** poin
7640: 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f  t to the same lo
7650: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  cking structure.
7660: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74    The locking st
7670: 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a  ructure keeps.**
7680: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
7690: 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b  nt (so we will k
76a0: 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65  now when to dele
76b0: 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e  te it) and a "cn
76c0: 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74  t".** field that
76d0: 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e   tells us its in
76e0: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  ternal lock stat
76f0: 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e  us.  cnt==0 mean
7700: 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  s the.** file is
7710: 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d   unlocked.  cnt=
7720: 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69  =-1 means the fi
7730: 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  le has an exclus
7740: 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74  ive lock..** cnt
7750: 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  >0 means there a
7760: 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f  re cnt shared lo
7770: 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  cks on the file.
7780: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d  .**.** Any attem
7790: 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  pt to lock or un
77a0: 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73  lock a file firs
77b0: 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63  t checks the loc
77c0: 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  king.** structur
77d0: 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20  e.  The fcntl() 
77e0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f  system call is o
77f0: 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73  nly invoked to s
7800: 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c  et a .** POSIX l
7810: 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72  ock if the inter
7820: 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75  nal lock structu
7830: 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  re transitions b
7840: 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b  etween.** a lock
7850: 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b  ed and an unlock
7860: 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ed state..**.** 
7870: 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65  But wait:  there
7880: 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72   are yet more pr
7890: 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49  oblems with POSI
78a0: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
78b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ..**.** If you c
78c0: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
78d0: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
78e0: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
78f0: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
7900: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
7910: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
7920: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
7930: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
7940: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
7950: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
7960: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
7970: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
7980: 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69  bject.** maintai
7990: 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ns a count of th
79a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64  e number of pend
79b0: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  ing locks on tha
79c0: 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20   inode..** When 
79d0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
79e0: 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75  de to close an u
79f0: 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72  nixFile, if ther
7a00: 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75  e are.** other u
7a10: 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20  nixFile open on 
7a20: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74  the same inode t
7a30: 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20  hat are holding 
7a40: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a  locks, the call.
7a50: 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68  ** to close() th
7a60: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
7a70: 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  r is deferred un
7a80: 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c  til all of the l
7a90: 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54  ocks clear..** T
7aa0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
7ab0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
7ac0: 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20   a list of file 
7ad0: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
7ae0: 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63   need to.** be c
7af0: 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c  losed and that l
7b00: 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61  ist is walked (a
7b10: 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e  nd cleared) when
7b20: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a   the last lock.*
7b30: 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20  * clears..**.** 
7b40: 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62  Yet another prob
7b50: 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61  lem:  LinuxThrea
7b60: 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77  ds do not play w
7b70: 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c  ell with posix l
7b80: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79  ocks..**.** Many
7b90: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
7ba0: 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65  of linux use the
7bb0: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69   LinuxThreads li
7bc0: 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a  brary which is.*
7bd0: 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70  * not posix comp
7be0: 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69  liant.  Under Li
7bf0: 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f  nuxThreads, a lo
7c00: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
7c10: 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74  read.** A cannot
7c20: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20   be modified or 
7c30: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20  overridden by a 
7c40: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
7c50: 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65   B..** Only thre
7c60: 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20  ad A can modify 
7c70: 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69  the lock.  Locki
7c80: 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ng behavior is c
7c90: 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65  orrect.** if the
7ca0: 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73   appliation uses
7cb0: 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76   the newer Nativ
7cc0: 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c  e Posix Thread L
7cd0: 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a  ibrary (NPTL).**
7ce0: 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68   on linux - with
7cf0: 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65   NPTL a lock cre
7d00: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41  ated by thread A
7d10: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
7d20: 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64  cks.** in thread
7d30: 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69   B.  But there i
7d40: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
7d50: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
7d60: 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64   which.** thread
7d70: 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62  ing library is b
7d80: 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74  eing used.  So t
7d90: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
7da0: 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d  o know at.** com
7db0: 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65  pile-time whethe
7dc0: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20  r or not thread 
7dd0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
7de0: 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42  ocks on thread B
7df0: 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20  ..** One has to 
7e00: 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68  do a run-time ch
7e10: 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20  eck to discover 
7e20: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
7e30: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70  the.** current p
7e40: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  rocess..**.** SQ
7e50: 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70  Lite used to sup
7e60: 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64  port LinuxThread
7e70: 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20  s.  But support 
7e80: 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  for LinuxThreads
7e90: 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20  .** was dropped 
7ea0: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76  beginning with v
7eb0: 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53  ersion 3.7.0.  S
7ec0: 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c  QLite will still
7ed0: 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69   work with.** Li
7ee0: 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69  nuxThreads provi
7ef0: 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65  ded that (1) the
7f00: 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68  re is no more th
7f10: 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f  an one connectio
7f20: 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61  n .** per databa
7f30: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73  se file in the s
7f40: 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ame process and 
7f50: 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e  (2) database con
7f60: 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e  nections.** do n
7f70: 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74  ot move across t
7f80: 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  hreads..*/../*.*
7f90: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
7fa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7fb0: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
7fc0: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
7fd0: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
7fe0: 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e  articular unixIn
7ff0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
8000: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  */.struct unixFi
8010: 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64  leId {.  dev_t d
8020: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
8030: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e       /* Device n
8040: 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f  umber */.#if OS_
8050: 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
8060: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
8070: 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20  pId;  /* Unique 
8080: 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f  file ID for vxwo
8090: 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20  rks. */.#else.  
80a0: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
80c0: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
80d0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
80e0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
80f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
8100: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
8110: 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65  ted for each ope
8120: 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c  n.** inode.  Or,
8130: 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73   on LinuxThreads
8140: 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f  , there is one o
8150: 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
8160: 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69  es for.** each i
8170: 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65  node opened by e
8180: 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  ach thread..**.*
8190: 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65  * A single inode
81a0: 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
81b0: 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
81c0: 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69  ors, so each uni
81d0: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
81e0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
81f0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
8200: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
8210: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
8220: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
8230: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
8240: 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70  er of unixFile p
8250: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
8260: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f  /.struct unixIno
8270: 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  deInfo {.  struc
8280: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
8290: 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  eId;       /* Th
82a0: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
82b0: 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20    int nShared;  
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
82e0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64  HARED locks held
82f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
8300: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
8310: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
8320: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
8330: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
8340: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
8350: 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b  ar bProcessLock;
8360: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75       /* An exclu
8370: 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63  sive process loc
8380: 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69  k is held */.  i
8390: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
83c0: 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72  ters to this str
83d0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78  ucture */.  unix
83e0: 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
83f0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
8400: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
8410: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
8420: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  s inode */.  int
8430: 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   nLock;         
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8450: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
8460: 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  nding file locks
8470: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
8480: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
8490: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
84a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
84b0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75   to close */.  u
84c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e  nixInodeInfo *pN
84d0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ext;           /
84e0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  * List of all un
84f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8500: 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  cts */.  unixIno
8510: 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20  deInfo *pPrev;  
8520: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e           /*    .
8530: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
8540: 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  d */.#if SQLITE_
8550: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
8560: 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20  TYLE.  unsigned 
8570: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
8580: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
8590: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
85a0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
85b0: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
85c0: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85e0: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
85f0: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
8600: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
8610: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
8620: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
8630: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
8640: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
8650: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
8660: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8670: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
8680: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
8690: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
86a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
86b0: 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72  tion - unixLogEr
86c0: 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79  ror_x(), is only
86d0: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
86e0: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e   the macro.** un
86f0: 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  ixLogError()..**
8700: 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  .** It is invoke
8710: 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  d after an error
8720: 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53   occurs in an OS
8730: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72   function and er
8740: 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  rno has been.** 
8750: 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d  set. It logs a m
8760: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
8770: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
8780: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
8790: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
87a0: 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  rno and, if poss
87b0: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
87c0: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
87d0: 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  ent from strerro
87e0: 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72  r() or.** strerr
87f0: 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  or_r()..**.** Th
8800: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8810: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
8820: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
8830: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
8840: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
8850: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
8860: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
8870: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
8880: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
8890: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
88a0: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
88b0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
88c0: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
88d0: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
88e0: 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e  led (e.g. "unlin
88f0: 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20  k", "open") and 
8900: 74 68 65 20 74 68 65 20 61 73 73 6f 63 69 61 74  the the associat
8910: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
8920: 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a  ath,.** if any..
8930: 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c  */.#define unixL
8940: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20  ogError(a,b,c)  
8950: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
8960: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49  tLine(a,b,c,__LI
8970: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
8980: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
8990: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
89a0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
89b0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
89c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
89d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
89e0: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
89f0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
8a00: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
8a10: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
8a20: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
8a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8a40: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
8a50: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
8a60: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
8a90: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
8aa0: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
8ab0: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20  {.  char *zErr; 
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66      /* Message f
8ae0: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
8af0: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a  r equivalent */.
8b00: 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65    int iErrno = e
8b10: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
8b20: 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61    /* Saved sysca
8b30: 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20  ll error number 
8b40: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
8b50: 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64   is not a thread
8b60: 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49  safe build (SQLI
8b70: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30  TE_THREADSAFE==0
8b80: 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a  ), then use.  **
8b90: 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20   the strerror() 
8ba0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  function to obta
8bb0: 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  in the human-rea
8bc0: 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  dable error mess
8bd0: 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c  age.  ** equival
8be0: 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74  ent to errno. Ot
8bf0: 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72  herwise, use str
8c00: 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20  error_r()..  */ 
8c10: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
8c20: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
8c30: 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f  d(HAVE_STRERROR_
8c40: 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38  R).  char aErr[8
8c50: 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72  0];.  memset(aEr
8c60: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72  r, 0, sizeof(aEr
8c70: 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45  r));.  zErr = aE
8c80: 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52  rr;..  /* If STR
8c90: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28  ERROR_R_CHAR_P (
8ca0: 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20  set by autoconf 
8cb0: 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53  scripts) or __US
8cc0: 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64  E_GNU is defined
8cd0: 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68  ,.  ** assume th
8ce0: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
8cf0: 6f 76 69 64 65 73 20 74 68 65 20 74 68 65 20 47  ovides the the G
8d00: 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74  NU version of st
8d10: 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 20  rerror_r() that 
8d20: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
8d30: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
8d40: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
8d50: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
8d60: 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a  . That pointer .
8d70: 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74    ** may point t
8d80: 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20  o aErr[], or it 
8d90: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  may point to som
8da0: 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65  e static storage
8db0: 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a   somewhere. .  *
8dc0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73  * Otherwise, ass
8dd0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
8de0: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
8df0: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f   POSIX version o
8e00: 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72  f .  ** strerror
8e10: 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61  _r(), which alwa
8e20: 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72  ys writes an err
8e30: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
8e40: 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  aErr[]..  **.  *
8e50: 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e  * If the code in
8e60: 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65  correctly assume
8e70: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
8e80: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74   POSIX version t
8e90: 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69  hat is.  ** avai
8ea0: 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72  lable, the error
8eb0: 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66   message will of
8ec0: 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20  ten be an empty 
8ed0: 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20  string. Not a.  
8ee0: 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e  ** huge problem.
8ef0: 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e   Incorrectly con
8f00: 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65  cluding that the
8f10: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20   GNU version is 
8f20: 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20  available .  ** 
8f30: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
8f40: 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e  segfault though.
8f50: 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
8f60: 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  d(STRERROR_R_CHA
8f70: 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  R_P) || defined(
8f80: 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72  __USE_GNU).  zEr
8f90: 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73  r = .# endif.  s
8fa0: 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f  trerror_r(iErrno
8fb0: 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61  , aErr, sizeof(a
8fc0: 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20  Err)-1);..#elif 
8fd0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8fe0: 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  E.  /* This is a
8ff0: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
9000: 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f  d, but strerror_
9010: 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  r() is not avail
9020: 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  able. */.  zErr 
9030: 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  = "";.#else.  /*
9040: 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20   Non-threadsafe 
9050: 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72  build, use strer
9060: 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72  ror(). */.  zErr
9070: 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72   = strerror(iErr
9080: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  no);.#endif..  a
9090: 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d  ssert( errcode!=
90a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
90b0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
90c0: 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69  ath = "";.  sqli
90d0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
90e0: 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e  .      "os_unix.
90f0: 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73  c:%d: (%d) %s(%s
9100: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
9110: 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46  Line, iErrno, zF
9120: 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72  unc, zPath, zErr
9130: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
9140: 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errcode;.}../*.*
9150: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  * Close a file d
9160: 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
9170: 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   We assume that 
9180: 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61  close() almost a
9190: 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e  lways works, sin
91a0: 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e  ce it is only in
91b0: 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20   a.** very sick 
91c0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f  application or o
91d0: 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c  n a very sick pl
91e0: 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d  atform that it m
91f0: 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66  ight fail..** If
9200: 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73   it does fail, s
9210: 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  imply leak the f
9220: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
9230: 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a  but do log the.*
9240: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e  * error..**.** N
9250: 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e  ote that it is n
9260: 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79  ot safe to retry
9270: 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45   close() after E
9280: 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a  INTR since the.*
9290: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
92a0: 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72  r might have alr
92b0: 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64  eady been reused
92c0: 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65   by another thre
92d0: 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e  ad..** So we don
92e0: 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72  't even try to r
92f0: 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45  ecover from an E
9300: 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20  INTR.  Just log 
9310: 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64  the error.** and
9320: 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61   move on..*/.sta
9330: 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f  tic void robust_
9340: 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  close(unixFile *
9350: 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e  pFile, int h, in
9360: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
9370: 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20   osClose(h) ){. 
9380: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
9390: 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45  tLine(SQLITE_IOE
93a0: 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65  RR_CLOSE, "close
93b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
93c0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20            pFile 
93d0: 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a  ? pFile->zPath :
93e0: 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d   0, lineno);.  }
93f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
9400: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
9410: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
9420: 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  in the unixInode
9430: 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Info->pUnused li
9440: 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  st..*/ .static v
9450: 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  oid closePending
9460: 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Fds(unixFile *pF
9470: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
9480: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
9490: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
94a0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
94b0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
94c0: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
94d0: 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  =pInode->pUnused
94e0: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
94f0: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
9500: 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  ext;.    robust_
9510: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e  close(pFile, p->
9520: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
9530: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9540: 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65  p);.  }.  pInode
9550: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
9560: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
9570: 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  a unixInodeInfo 
9580: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
9590: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
95a0: 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  y findInodeInfo(
95b0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
95c0: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
95d0: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
95e0: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
95f0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
9600: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
9610: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
9620: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
9630: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
9640: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
9650: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9660: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
9670: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
9680: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
9690: 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
96a0: 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20  S(pInode) ){.   
96b0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b   pInode->nRef--;
96c0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
96d0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
96e0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
96f0: 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b  ->pShmNode==0 );
9700: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
9710: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
9720: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
9730: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
9740: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
9750: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
9760: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
9770: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d    pInode->pPrev-
9780: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
9790: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
97a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
97b0: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d  ert( inodeList==
97c0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
97d0: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
97e0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
97f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
9800: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a  Inode->pNext ){.
9810: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9820: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
9830: 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Prev==pInode );.
9840: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
9850: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
9860: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20  Inode->pPrev;.  
9870: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9880: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
9890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
98a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
98b0: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
98c0: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
98d0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
98e0: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
98f0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
9900: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
9910: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
9920: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
9930: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
9940: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
9950: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
9960: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
9970: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
9980: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
9990: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
99a0: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
99b0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
99c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
99d0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
99e0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
99f0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
9a00: 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49  c int findInodeI
9a10: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
9a20: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
9a30: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
9a40: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
9a50: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
9a60: 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  y */.  unixInode
9a70: 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20  Info **ppInode  
9a80: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
9a90: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9aa0: 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f  o object here */
9ab0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
9ae0: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
9af0: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
9b20: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
9b30: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
9b40: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
9b50: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
9b60: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
9b70: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a  nixInodeInfo */.
9b80: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
9b90: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
9ba0: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
9bb0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
9bc0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9bd0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20  o *pInode = 0;  
9be0: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
9bf0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9c00: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
9c10: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
9c20: 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  () );..  /* Get 
9c30: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
9c40: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
9c50: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
9c60: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
9c70: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
9c80: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
9c90: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
9ca0: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73  le->h;.  rc = os
9cb0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
9cc0: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
9cd0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
9ce0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
9cf0: 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c  ;.#ifdef EOVERFL
9d00: 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  OW.    if( pFile
9d10: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
9d20: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
9d30: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
9d40: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
9d50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
9d60: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
9d70: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
9d80: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
9d90: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
9da0: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
9db0: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
9dc0: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
9dd0: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
9de0: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
9df0: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
9e00: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
9e10: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
9e20: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
9e30: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
9e40: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
9e50: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
9e60: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
9e70: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
9e80: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
9e90: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
9ea0: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
9eb0: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
9ec0: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
9ed0: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
9ee0: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
9ef0: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
9f00: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
9f10: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
9f20: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
9f30: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
9f40: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
9f50: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
9f60: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
9f70: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
9f80: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
9f90: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
9fa0: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
9fb0: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
9fc0: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
9fd0: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
9fe0: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
9ff0: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
a000: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
a010: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
a020: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
a030: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
a040: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
a050: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
a060: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
a070: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
a080: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
a090: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a0a0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
a0b0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
a0c0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
a0d0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
a0e0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
a0f0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
a100: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
a110: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
a120: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
a130: 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c   memset(&fileId,
a140: 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49   0, sizeof(fileI
a150: 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65  d));.  fileId.de
a160: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
a170: 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  ev;.#if OS_VXWOR
a180: 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20  KS.  fileId.pId 
a190: 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65  = pFile->pId;.#e
a1a0: 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f  lse.  fileId.ino
a1b0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e   = statbuf.st_in
a1c0: 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f  o;.#endif.  pIno
a1d0: 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
a1e0: 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
a1f0: 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49  && memcmp(&fileI
a200: 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  d, &pInode->file
a210: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
a220: 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  d)) ){.    pInod
a230: 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
a240: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  t;.  }.  if( pIn
a250: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  ode==0 ){.    pI
a260: 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  node = sqlite3_m
a270: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
a280: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
a290: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
a2a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a2b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
a2c0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
a2d0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
a2e0: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
a2f0: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
a300: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
a310: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
a320: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d    pInode->nRef =
a330: 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   1;.    pInode->
a340: 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73  pNext = inodeLis
a350: 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  t;.    pInode->p
a360: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
a370: 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e  ( inodeList ) in
a380: 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  odeList->pPrev =
a390: 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f   pInode;.    ino
a3a0: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b  deList = pInode;
a3b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
a3c0: 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  node->nRef++;.  
a3d0: 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70  }.  *ppInode = p
a3e0: 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  Inode;.  return 
a3f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
a400: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a410: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
a420: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
a430: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
a440: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
a450: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
a460: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
a470: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
a480: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
a490: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
a4a0: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
a4b0: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
a4c0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
a4d0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
a4e0: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
a4f0: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
a500: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
a510: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
a520: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
a530: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
a540: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
a550: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a560: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
a570: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a580: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
a590: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
a5a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
a5b0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
a5c0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
a5d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
a5e0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
a5f0: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
a600: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
a610: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
a620: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
a630: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
a640: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
a650: 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ads */..  /* Che
a660: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
a670: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
a680: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
a690: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
a6a0: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
a6b0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
a6c0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
a6d0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
a6e0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
a6f0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
a700: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
a710: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
a720: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
a730: 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49  ed && !pFile->pI
a740: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
a750: 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ck ){.    struct
a760: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
a770: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
a780: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
a790: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
a7a0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
a7b0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
a7c0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
a7d0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
a7e0: 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  if( osFcntl(pFil
a7f0: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
a800: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72  lock) ){.      r
a810: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
a820: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
a830: 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
a840: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a850: 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  no;.    } else i
a860: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
a870: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
a880: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
a890: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
a8a0: 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
a8b0: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
a8c0: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
a8d0: 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c  %d %d %d (unix)\
a8e0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
a8f0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
a900: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
a910: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
a920: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
a930: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
a940: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
a950: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
a960: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
a970: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
a980: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
a990: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
a9a0: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
a9b0: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
a9c0: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
a9d0: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
a9e0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
a9f0: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
aa00: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
aa10: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
aa20: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
aa30: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
aa40: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
aa50: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
aa60: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
aa70: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
aa80: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
aa90: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
aaa0: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
aab0: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
aac0: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
aad0: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
aae0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
aaf0: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
ab00: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
ab10: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
ab20: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
ab30: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
ab40: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
ab50: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
ab60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ab70: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
ab80: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
ab90: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
aba0: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
abb0: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
abc0: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
abd0: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
abe0: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
abf0: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
ac00: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
ac10: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
ac20: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
ac30: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
ac40: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
ac50: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
ac60: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
ac70: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
ac80: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
ac90: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
aca0: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
acb0: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
acc0: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
acd0: 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  k *pLock){.  int
ace0: 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65   rc;.  unixInode
acf0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
ad00: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
ad10: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
ad20: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73  xHeld() );.  ass
ad30: 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29  ert( pInode!=0 )
ad40: 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d  ;.  if( ((pFile-
ad50: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
ad60: 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c  XFILE_EXCL)!=0 |
ad70: 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  | pInode->bProce
ad80: 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28  ssLock).   && ((
ad90: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
ada0: 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e   & UNIXFILE_RDON
adb0: 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  LY)==0).  ){.   
adc0: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
add0: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
ade0: 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f        struct flo
adf0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  ck lock;.      a
ae00: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
ae10: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
ae20: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
ae30: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
ae40: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ae50: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
ae60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ae70: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
ae80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
ae90: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20  = F_WRLCK;.     
aea0: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
aeb0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
aec0: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69   &lock);.      i
aed0: 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  f( rc<0 ) return
aee0: 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64   rc;.      pInod
aef0: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
af00: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  = 1;.      pInod
af10: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
af20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
af30: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
af40: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  se{.    rc = osF
af50: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
af60: 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a  _SETLK, pLock);.
af70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
af80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
af90: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
afa0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
afb0: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
afc0: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
afd0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
afe0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
aff0: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
b000: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
b010: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
b020: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
b030: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
b040: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
b050: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
b060: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
b070: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
b080: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
b090: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
b0a0: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
b0b0: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
b0c0: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
b0d0: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
b0e0: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
b0f0: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
b100: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
b110: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
b120: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
b130: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
b140: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
b150: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
b160: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
b170: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
b180: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
b190: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
b1a0: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
b1b0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
b1c0: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
b1d0: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
b1e0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
b1f0: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
b200: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
b210: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
b220: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
b230: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
b240: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
b250: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
b260: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
b270: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
b280: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
b290: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
b2a0: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
b2b0: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  nt unixLock(sqli
b2c0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
b2d0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
b2e0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
b2f0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
b300: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
b310: 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
b320: 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b  ks and.  ** lock
b330: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20   transitions in 
b340: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53  terms of the POS
b350: 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72  IX advisory shar
b360: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
b370: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69  .  ** lock primi
b380: 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65  tives (called re
b390: 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69  ad-locks and wri
b3a0: 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20  te-locks below, 
b3b0: 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f  to avoid.  ** co
b3c0: 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c  nfusion with SQL
b3d0: 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e  ite lock names).
b3e0: 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20   The algorithms 
b3f0: 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a  are complicated.
b400: 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e    ** slightly in
b410: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d   order to be com
b420: 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e  patible with win
b430: 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d  dows systems sim
b440: 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a  ultaneously.  **
b450: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
b460: 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
b470: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20  e, in case that 
b480: 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64  is ever required
b490: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62  ..  **.  ** Symb
b4a0: 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f  ols defined in o
b4b0: 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68  s.h indentify th
b4c0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
b4d0: 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76   and the 'reserv
b4e0: 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65  ed.  ** byte', e
b4f0: 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73  ach single bytes
b500: 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f   at well known o
b510: 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20  ffsets, and the 
b520: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
b530: 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67  * range', a rang
b540: 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61  e of 510 bytes a
b550: 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f  t a well known o
b560: 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ffset..  **.  **
b570: 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41   To obtain a SHA
b580: 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64  RED lock, a read
b590: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
b5a0: 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  d on the 'pendin
b5b0: 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49  g.  ** byte'.  I
b5c0: 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73  f this is succes
b5d0: 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62  sful, a random b
b5e0: 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68  yte from the 'sh
b5f0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
b600: 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f  ange' is read-lo
b610: 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63  cked and the loc
b620: 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  k on the 'pendin
b630: 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64  g byte' released
b640: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72  ..  **.  ** A pr
b650: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
b660: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
b670: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
b680: 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  as a SHARED lock
b690: 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45  ..  ** A RESERVE
b6a0: 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  D lock is implem
b6b0: 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e  ented by grabbin
b6c0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
b6d0: 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65  n the.  ** 'rese
b6e0: 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a  rved byte'. .  *
b6f0: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
b700: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
b710: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
b720: 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74  after it has obt
b730: 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41  ained a.  ** SHA
b740: 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44  RED lock. A PEND
b750: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  ING lock is impl
b760: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
b770: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
b780: 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70  k.  ** on the 'p
b790: 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68  ending byte'. Th
b7a0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
b7b0: 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f  no new SHARED lo
b7c0: 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  cks can be.  ** 
b7d0: 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78  obtained, but ex
b7e0: 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f  isting SHARED lo
b7f0: 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  cks are allowed 
b800: 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72  to persist. A pr
b810: 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20  ocess.  ** does 
b820: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61  not have to obta
b830: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
b840: 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ck on the way to
b850: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e   a PENDING lock.
b860: 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65  .  ** This prope
b870: 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74  rty is used by t
b880: 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72  he algorithm for
b890: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
b8a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
b8b0: 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e  * after a crash.
b8c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58  .  **.  ** An EX
b8d0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62  CLUSIVE lock, ob
b8e0: 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50  tained after a P
b8f0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68  ENDING lock is h
b900: 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70  eld, is.  ** imp
b910: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
b920: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
b930: 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65  ck on the entire
b940: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
b950: 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65  ** range'. Since
b960: 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73   all other locks
b970: 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d   require a read-
b980: 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  lock on one of t
b990: 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69  he bytes.  ** wi
b9a0: 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c  thin this range,
b9b0: 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
b9c0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b  at no other lock
b9d0: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68  s are held on th
b9e0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
b9f0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
ba00: 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20  reason a single 
ba10: 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75  byte cannot be u
ba20: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
ba30: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
ba40: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74    ** range' is t
ba50: 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e  hat some version
ba60: 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20  s of windows do 
ba70: 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64  not support read
ba80: 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20  -locks. By.  ** 
ba90: 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d  locking a random
baa0: 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e   byte from a ran
bab0: 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53  ge, concurrent S
bac0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20  HARED locks may 
bad0: 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20  exist.  ** even 
bae0: 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  if the locking p
baf0: 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73  rimitive used is
bb00: 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d   always a write-
bb10: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  lock..  */.  int
bb20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bb30: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
bb40: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
bb50: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
bb60: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
bb70: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
bb80: 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d  ;.  int tErrno =
bb90: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
bba0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
bbb0: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
bbc0: 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
bbd0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
bbe0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
bbf0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
bc00: 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
bc10: 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
bc20: 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46  Lock),.      azF
bc30: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70  ileLock(pFile->p
bc40: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
bc50: 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ), pFile->pInode
bc60: 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
bc70: 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
bc80: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
bc90: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
bca0: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
bcb0: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
bcc0: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
bcd0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
bce0: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
bcf0: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
bd00: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
bd10: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
bd20: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
bd30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
bd40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
bd50: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
bd60: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
bd70: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
bd80: 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
bd90: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
bda0: 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
bdb0: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
bdc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
bdd0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
bde0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
bdf0: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
be00: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
be10: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
be20: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
be30: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
be40: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
be50: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
be60: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
be70: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
be80: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
be90: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
bea0: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
beb0: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
bec0: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
bed0: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
bee0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
bef0: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
bf00: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
bf10: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
bf20: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
bf30: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
bf40: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
bf50: 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
bf60: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
bf70: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
bf80: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
bf90: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
bfa0: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
bfb0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
bfc0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
bfd0: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
bfe0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
bff0: 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
c000: 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
c010: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
c020: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
c030: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
c040: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
c050: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
c060: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
c070: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
c080: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
c090: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
c0a0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
c0b0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
c0c0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
c0d0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
c0e0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
c0f0: 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
c100: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
c110: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
c120: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
c130: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
c140: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
c150: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
c160: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
c170: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
c180: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
c190: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
c1a0: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
c1b0: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
c1c0: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
c1d0: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
c1e0: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
c1f0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c200: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
c210: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
c220: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c230: 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
c240: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
c250: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
c260: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
c270: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
c280: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
c290: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
c2a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c2b0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
c2c0: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
c2d0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
c2e0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
c2f0: 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
c300: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
c310: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
c320: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
c330: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
c340: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
c350: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
c360: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
c370: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
c380: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
c390: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
c3a0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
c3b0: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
c3c0: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
c3d0: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
c3e0: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
c3f0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
c400: 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
c410: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c420: 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
c430: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c440: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
c450: 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
c460: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
c470: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
c480: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c490: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
c4a0: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
c4b0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
c4c0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
c4d0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
c4e0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
c4f0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
c500: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
c510: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
c520: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
c530: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
c540: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
c550: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
c560: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
c570: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
c580: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
c590: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
c5a0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
c5b0: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
c5c0: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
c5d0: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
c5e0: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
c5f0: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
c600: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
c610: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
c620: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
c630: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
c640: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c650: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c660: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
c670: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
c680: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
c690: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
c6a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
c6b0: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
c6c0: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
c6d0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
c6e0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
c6f0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
c700: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c710: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
c720: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
c730: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
c740: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c750: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
c760: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
c770: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
c780: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
c790: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   }..    /* Drop 
c7a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
c7b0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
c7c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c7d0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
c7e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c7f0: 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
c800: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c810: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
c820: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
c830: 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
c840: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
c850: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
c860: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
c870: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74  mount */.      t
c880: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c890: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c8a0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a  _IOERR_UNLOCK; .
c8b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
c8c0: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  c ){.      if( r
c8d0: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
c8e0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
c8f0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
c900: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
c910: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c920: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c930: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c940: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c950: 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
c960: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
c970: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
c980: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
c990: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
c9a0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c9b0: 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
c9c0: 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
c9d0: 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
c9e0: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
c9f0: 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
ca00: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
ca10: 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
ca20: 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
ca30: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
ca40: 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
ca50: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
ca60: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
ca70: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
ca80: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
ca90: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
caa0: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
cab0: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
cac0: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
cad0: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
cae0: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
caf0: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
cb00: 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
cb10: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
cb20: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
cb30: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20   = F_WRLCK;..   
cb40: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
cb50: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
cb60: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
cb70: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
cb80: 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  ;.    if( eFileL
cb90: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
cba0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
cbb0: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
cbc0: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
cbd0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
cbe0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cbf0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
cc00: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
cc10: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
cc20: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
cc30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e     }..    if( un
cc40: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
cc50: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
cc60: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
cc70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
cc80: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
cc90: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
cca0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
ccb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
ccc0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
ccd0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
cce0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
ccf0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
cd00: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66  .  }.  ..#ifndef
cd10: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74   NDEBUG.  /* Set
cd20: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
cd30: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
cd40: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
cd50: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
cd60: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
cd70: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
cd80: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
cd90: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
cda0: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
cdb0: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
cdc0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
cdd0: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
cde0: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
cdf0: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
ce00: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
ce10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ce20: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
ce30: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
ce40: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
ce50: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
ce60: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
ce70: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
ce80: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
ce90: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
cea0: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
ceb0: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
cec0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
ced0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cee0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
cef0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
cf00: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
cf10: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
cf20: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
cf30: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
cf40: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
cf50: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
cf60: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
cf70: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
cf80: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
cf90: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
cfa0: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
cfb0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
cfc0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
cfd0: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
cfe0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
cff0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
d000: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
d010: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
d020: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
d030: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d040: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
d050: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
d060: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
d070: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
d080: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
d090: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
d0a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
d0b0: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
d0c0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
d0d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
d0e0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
d0f0: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
d100: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
d110: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
d120: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
d130: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
d140: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
d150: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
d160: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
d170: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
d180: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
d190: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
d1a0: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
d1b0: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
d1c0: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
d1d0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
d1e0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
d1f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
d200: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
d210: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
d220: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
d230: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
d240: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
d250: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
d260: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
d270: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
d280: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
d290: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
d2a0: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
d2b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
d2c0: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
d2d0: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
d2e0: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
d2f0: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
d300: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
d310: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
d320: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
d330: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
d340: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
d350: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
d360: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
d370: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
d380: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
d390: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
d3a0: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
d3b0: 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
d3c0: 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
d3d0: 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
d3e0: 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
d3f0: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
d400: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
d410: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
d420: 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
d430: 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
d440: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
d450: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
d460: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d470: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
d480: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
d490: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d4a0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
d4b0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
d4c0: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
d4d0: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
d4e0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
d4f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
d500: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
d510: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
d520: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
d530: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
d540: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
d550: 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29  .      getpid())
d560: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
d570: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
d580: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
d590: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
d5a0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
d5b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d5c0: 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
d5d0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
d5e0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
d5f0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
d600: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
d610: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
d620: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
d630: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
d640: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
d650: 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
d660: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23  >eFileLock );..#
d670: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
d680: 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
d690: 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
d6a0: 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
d6b0: 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
d6c0: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
d6d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
d6e0: 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
d6f0: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
d700: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
d710: 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
d720: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
d730: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
d740: 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
d750: 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
d760: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
d770: 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
d780: 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
d790: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
d7a0: 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
d7b0: 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
d7c0: 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
d7d0: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
d7e0: 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
d7f0: 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
d800: 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
d810: 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
d820: 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
d830: 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
d840: 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
d850: 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  /.    pFile->inN
d860: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
d870: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64  #endif..    /* d
d880: 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20  owngrading to a 
d890: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e  shared lock on N
d8a0: 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61  FS involves clea
d8b0: 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c  ring the write l
d8c0: 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  ock.    ** befor
d8d0: 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74  e establishing t
d8e0: 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f  he readlock - to
d8f0: 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f   avoid a race co
d900: 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67  ndition we downg
d910: 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  rade.    ** the 
d920: 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73  lock in 2 blocks
d930: 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f  , so that part o
d940: 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c  f the range will
d950: 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61   be covered by a
d960: 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c   .    ** write l
d970: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ock until the re
d980: 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79  st is covered by
d990: 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20   a read lock:.  
d9a0: 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57    **  1:   [WWWW
d9b0: 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20  W].    **  2:   
d9c0: 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20  [....W].    **  
d9d0: 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20  3:   [RRRRW].   
d9e0: 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e   **  4:   [RRRR.
d9f0: 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ].    */.    if(
da00: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
da10: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20  ED_LOCK ){..#if 
da20: 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45  !defined(__APPLE
da30: 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45  __) || !SQLITE_E
da40: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
da50: 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29  YLE.      (void)
da60: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b  handleNFSUnlock;
da70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
da80: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d  andleNFSUnlock==
da90: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  0 );.#endif.#if 
daa0: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
dab0: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
dac0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
dad0: 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64  E.      if( hand
dae0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20  leNFSUnlock ){. 
daf0: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
db00: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
db10: 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
db20: 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rom system call 
db30: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  errors */.      
db40: 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20    off_t divSize 
db50: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  = SHARED_SIZE - 
db60: 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
db70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
db80: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
db90: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
dba0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
dbb0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
dbc0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
dbd0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dbe0: 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
dbf0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
dc00: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
dc10: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
dc20: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
dc30: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
dc40: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
dc50: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
dc60: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
dc70: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
dc80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
dc90: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dca0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
dcb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
dcc0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
dcd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dce0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
dcf0: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
dd00: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
dd10: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
dd20: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
dd30: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
dd40: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
dd50: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
dd60: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
dd70: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
dd80: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
dd90: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
dda0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
ddb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
ddc0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
ddd0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
dde0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20  OERR_RDLOCK);.  
ddf0: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
de00: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
de10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
de20: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
de30: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
de40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
de50: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
de60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de70: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
de80: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
de90: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
dea0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
deb0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
dec0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69   SHARED_FIRST+di
ded0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c  vSize;.        l
dee0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
def0: 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b  ED_SIZE-divSize;
df00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
df10: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
df20: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
df30: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
df40: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
df50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
df60: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
df70: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
df80: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
df90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
dfa0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
dfb0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
dfc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
dfd0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
dfe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dff0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
e000: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
e010: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
e020: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
e030: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  E */.      {.   
e040: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
e050: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
e060: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e070: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e080: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e090: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
e0a0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
e0b0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
e0c0: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IZE;.        if(
e0d0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e0e0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
e0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74           /* In t
e100: 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20  heory, the call 
e110: 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  to unixFileLock(
e120: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65  ) cannot fail be
e130: 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20  cause another.  
e140: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
e150: 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  ss is holding an
e160: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f   incompatible lo
e170: 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ck. If it does, 
e180: 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
e190: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ** indicates tha
e1a0: 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63  t the other proc
e1b0: 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
e1c0: 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67  wing the locking
e1d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
e1e0: 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20  otocol. If this 
e1f0: 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20  happens, return 
e200: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
e210: 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20  OCK. Returning. 
e220: 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
e230: 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f  TE_BUSY would co
e240: 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72 20  nfuse the upper 
e250: 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74 69  layer (in practi
e260: 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20 20  ce it causes .  
e270: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73          ** an as
e280: 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a  sert to fail). *
e290: 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  / .          rc 
e2a0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
e2b0: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  DLOCK;.         
e2c0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e2d0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e2e0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
e2f0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
e300: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e310: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e320: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
e330: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
e340: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
e350: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
e360: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
e370: 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
e380: 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
e390: 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
e3a0: 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
e3b0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e3c0: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
e3d0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
e3e0: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
e3f0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
e400: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
e410: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e420: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
e430: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
e440: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
e450: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  _unlock;.    }. 
e460: 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f   }.  if( eFileLo
e470: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck==NO_LOCK ){. 
e480: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
e490: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
e4a0: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
e4b0: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
e4c0: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
e4d0: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
e4e0: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
e4f0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
e500: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
e510: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
e520: 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
e530: 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
e540: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
e550: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  ed==0 ){.      l
e560: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e570: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
e580: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
e590: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
e5a0: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
e5b0: 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
e5c0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e5d0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e5e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
e5f0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e600: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
e610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e620: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e630: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 09 70 46 69 6c  RR_UNLOCK;..pFil
e640: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
e650: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 49  rrno;.        pI
e660: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
e670: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
e680: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
e690: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
e6a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e6b0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
e6c0: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
e6d0: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
e6e0: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
e6f0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
e700: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
e710: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
e720: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
e730: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
e740: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
e750: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
e760: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
e770: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
e780: 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
e790: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
e7a0: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
e7b0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
e7c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
e7d0: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
e7e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a  e);.    }.  }...
e7f0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e  end_unlock:.  un
e800: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
e810: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e820: 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
e830: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
e840: 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
e850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
e860: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e870: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
e880: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
e890: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
e8a0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
e8b0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
e8c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
e8d0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
e8e0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
e8f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e900: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
e910: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
e920: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
e930: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
e940: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
e950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
e960: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
e970: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
e980: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74  FileLock){.  ret
e990: 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
e9a0: 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
e9b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e9c0: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
e9d0: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
e9e0: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
e9f0: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
ea00: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
ea10: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
ea20: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
ea30: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
ea40: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
ea50: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
ea60: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
ea70: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
ea80: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
ea90: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
eaa0: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
eab0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
eac0: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
ead0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
eae0: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
eaf0: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
eb00: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
eb10: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
eb20: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
eb30: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
eb40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
eb50: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
eb60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
eb70: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
eb80: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
eb90: 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
eba0: 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f  ->h>=0 ){.    ro
ebb0: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
ebc0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
ebd0: 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
ebe0: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69  ->h = -1;.  }.#i
ebf0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
ec00: 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
ec10: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
ec20: 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  isDelete ){.    
ec30: 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65    osUnlink(pFile
ec40: 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
ec50: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  lName);.    }.  
ec60: 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65    vxworksRelease
ec70: 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49  FileId(pFile->pI
ec80: 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  d);.    pFile->p
ec90: 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  Id = 0;.  }.#end
eca0: 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
ecb0: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
ecc0: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
ecd0: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
ece0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
ecf0: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  ile->pUnused);. 
ed00: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
ed10: 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
ed20: 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
ed30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ed40: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
ed50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
ed60: 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
ed70: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
ed80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ed90: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
eda0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
edb0: 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  )id;.  unixUnloc
edc0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
edd0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
ede0: 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69  ();..  /* unixFi
edf0: 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77  le.pInode is alw
ee00: 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20  ays valid here. 
ee10: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66  Otherwise, a dif
ee20: 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a  ferent close.  *
ee30: 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20  * routine (e.g. 
ee40: 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77  nolockClose()) w
ee50: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69  ould be called i
ee60: 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61  nstead..  */.  a
ee70: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49  ssert( pFile->pI
ee80: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c  node->nLock>0 ||
ee90: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
eea0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
eeb0: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
eec0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26  pFile->pInode) &
eed0: 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
eee0: 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
eef0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
ef00: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
ef10: 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
ef20: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
ef30: 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
ef40: 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
ef50: 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
ef60: 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
ef70: 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
ef80: 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
ef90: 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
efa0: 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
efb0: 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
efc0: 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a  y closed .    **
efd0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
efe0: 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
eff0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
f000: 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
f010: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
f020: 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
f030: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
f040: 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c  ile(id);.  unixL
f050: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
f060: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn rc;.}../**
f070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
f080: 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64   of the posix ad
f090: 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c  visory lock impl
f0a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
f0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
f0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d  ************ No-
f180: 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  op Locking *****
f190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f1b0: 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f  .** Of the vario
f1c0: 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  us locking imple
f1d0: 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c  mentations avail
f1e0: 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79  able, this is by
f1f0: 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70   far the.** simp
f200: 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69  lest:  locking i
f210: 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61  s ignored.  No a
f220: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
f230: 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  o lock the datab
f240: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  ase.** file for 
f250: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
f260: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c  ng..**.** This l
f270: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61  ocking mode is a
f280: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75  ppropriate for u
f290: 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  se on read-only 
f2a0: 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78  databases.** (ex
f2b0: 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  : databases that
f2c0: 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f   are burned into
f2d0: 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61   CD-ROM, for exa
f2e0: 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a  mple.)  It can.*
f2f0: 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69  * also be used i
f300: 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
f310: 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65  n employs some e
f320: 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73  xternal mechanis
f330: 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20  m to.** prevent 
f340: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63  simultaneous acc
f350: 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ess of the same 
f360: 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20  database by two 
f370: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62  or more.** datab
f380: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
f390: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61    But there is a
f3a0: 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66   serious risk of
f3b0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72   database.** cor
f3c0: 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20  ruption if this 
f3d0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
f3e0: 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f  used in situatio
f3f0: 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c  ns where multipl
f400: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
f410: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63  nnections are ac
f420: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
f430: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
f440: 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69  t the same.** ti
f450: 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f  me and one or mo
f460: 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e  re of those conn
f470: 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74  ections are writ
f480: 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  ing..*/..static 
f490: 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  int nolockCheckR
f4a0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
f4b0: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
f4c0: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
f4d0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
f4e0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
f4f0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
f500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f510: 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
f520: 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  nolockLock(sqlit
f530: 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
f540: 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
f550: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
f560: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
f570: 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
f580: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
f590: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
f5a0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
f5b0: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
f5c0: 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
f5d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
f5e0: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
f5f0: 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
f600: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f610: 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  * Close the file
f620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f630: 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  nolockClose(sqli
f640: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
f650: 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
f660: 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f  ixFile(id);.}../
f670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f680: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
f690: 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  o-op lock implem
f6a0: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
f6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
f710: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
f780: 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67  dot-file Locking
f790: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
f7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f7b0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c  **.** The dotfil
f7c0: 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
f7d0: 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68  entation uses th
f7e0: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73  e existance of s
f7f0: 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20  eparate lock.** 
f800: 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20  files (really a 
f810: 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f  directory) to co
f820: 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
f830: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
f840: 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20  his works.** on 
f850: 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79  just about every
f860: 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67   filesystem imag
f870: 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65  inable.  But the
f880: 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64  re are serious d
f890: 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20  ownsides:.**.** 
f8a0: 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73     (1)  There is
f8b0: 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63   zero concurrenc
f8c0: 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61  y.  A single rea
f8d0: 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f  der blocks all o
f8e0: 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
f8f0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  connections from
f900: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
f910: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
f920: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
f930: 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  An application c
f940: 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f  rash or power lo
f950: 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61  ss can leave sta
f960: 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a  le lock files.**
f970: 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67           sitting
f980: 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65   around that nee
f990: 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20  d to be cleared 
f9a0: 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  manually..**.** 
f9b0: 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20  Nevertheless, a 
f9c0: 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70  dotlock is an ap
f9d0: 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
f9e0: 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69  g mode for use i
f9f0: 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f  f no.** other lo
fa00: 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69  cking strategy i
fa10: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  s available..**.
fa20: 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  ** Dotfile locki
fa30: 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61  ng works by crea
fa40: 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74  ting a subdirect
fa50: 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ory in the same 
fa60: 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20  directory as.** 
fa70: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
fa80: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
fa90: 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22  ame but with a "
faa0: 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e  .lock" extension
fab0: 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65   added..** The e
fac0: 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f  xistance of a lo
fad0: 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70  ck directory imp
fae0: 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56  lies an EXCLUSIV
faf0: 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68  E lock.  All oth
fb00: 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73  er.** lock types
fb10: 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56   (SHARED, RESERV
fb20: 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65  ED, PENDING) are
fb30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43   mapped into EXC
fb40: 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  LUSIVE..*/../*.*
fb50: 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69  * The file suffi
fb60: 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  x added to the d
fb70: 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d  ata base filenam
fb80: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
fb90: 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  eate the.** lock
fba0: 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23   directory..*/.#
fbb0: 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53  define DOTLOCK_S
fbc0: 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f  UFFIX ".lock"../
fbd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fbe0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
fbf0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
fc00: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
fc10: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
fc20: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
fc30: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
fc40: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
fc50: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
fc60: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
fc70: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
fc80: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
fc90: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
fca0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
fcb0: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
fcc0: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
fcd0: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
fce0: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
fcf0: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  checking..**.** 
fd00: 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  In dotfile locki
fd10: 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63  ng, either a loc
fd20: 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64  k exists or it d
fd30: 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20  oes not.  So in 
fd40: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f  this.** variatio
fd50: 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76  n of CheckReserv
fd60: 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f  edLock(), *pResO
fd70: 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ut is set to tru
fd80: 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a  e if any lock.**
fd90: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
fda0: 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69  file and false i
fdb0: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
fdc0: 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  locked..*/.stati
fdd0: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65  c int dotlockChe
fde0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
fdf0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
fe00: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
fe10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
fe20: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
fe30: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
fe40: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
fe50: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
fe60: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
fe70: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
fe80: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
fe90: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
fea0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
feb0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
fec0: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
fed0: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
fee0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
fef0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
ff00: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
ff10: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
ff20: 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  er this connecti
ff30: 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  on or some other
ff40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74   connection in t
ff50: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a  he same process.
ff60: 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c      ** holds a l
ff70: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  ock on the file.
ff80: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65    No need to che
ff90: 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  ck further. */. 
ffa0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
ffb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
ffc0: 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c   The lock is hel
ffd0: 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  d if and only if
ffe0: 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78   the lockfile ex
fff0: 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ists */.    cons
10000 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c  t char *zLockFil
10010 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
10020 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
10030 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65  ontext;.    rese
10040 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28  rved = osAccess(
10050 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30  zLockFile, 0)==0
10060 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
10070 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
10080 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b  d %d %d (dotlock
10090 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
100a0 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
100b0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
100c0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
100d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
100e0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
100f0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
10100 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
10110 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
10120 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
10130 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
10140 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
10150 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
10160 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
10170 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
10180 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
10190 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
101a0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
101b0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
101c0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
101d0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
101e0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
101f0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
10200 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
10210 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
10220 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
10230 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
10240 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
10250 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
10260 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
10270 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
10280 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
10290 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
102a0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
102b0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
102c0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
102d0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
102e0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
102f0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
10300 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
10310 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
10320 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
10330 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
10340 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
10350 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
10360 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
10370 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
10380 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
10390 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
103a0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
103b0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
103c0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
103d0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
103e0 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
103f0 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69   level..**.** Wi
10400 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  th dotfile locki
10410 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e  ng, we really on
10420 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65  ly support state
10430 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e   (4): EXCLUSIVE.
10440 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b  .** But we track
10450 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69   the other locki
10460 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e  ng levels intern
10470 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ally..*/.static 
10480 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28  int dotlockLock(
10490 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
104a0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
104b0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
104c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
104d0 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  *)id;.  char *zL
104e0 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
104f0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
10500 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72  Context;.  int r
10510 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
10520 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65  .  /* If we have
10530 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
10540 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c  the lock file al
10550 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41  ready exists.  A
10560 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
10570 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20  to do is adjust 
10580 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  our internal rec
10590 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ord of the lock 
105a0 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  level..  */.  if
105b0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
105c0 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ck > NO_LOCK ){.
105d0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
105e0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
105f0 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ;.    /* Always 
10600 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73  update the times
10610 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20  tamp on the old 
10620 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48  file */.#ifdef H
10630 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74  AVE_UTIME.    ut
10640 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  ime(zLockFile, N
10650 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ULL);.#else.    
10660 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
10670 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
10680 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10690 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
106a0 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
106b0 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63  ive lock */.  rc
106c0 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b   = osMkdir(zLock
106d0 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69  File, 0777);.  i
106e0 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f  f( rc<0 ){.    /
106f0 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
10700 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b  /create the lock
10710 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
10720 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
10730 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
10740 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
10750 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10760 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
10770 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
10780 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10790 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
107a0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
107b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
107c0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
107d0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
107e0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
107f0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
10800 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
10810 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20  rn rc;.  } .  . 
10820 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
10830 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
10840 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
10850 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10860 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
10870 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10880 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
10890 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
108a0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
108b0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
108c0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
108d0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
108e0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
108f0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10900 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10910 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
10920 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10930 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10940 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10950 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
10960 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10970 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
10980 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
10990 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
109a0 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
109b0 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
109c0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
109d0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
109e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
109f0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
10a00 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10a10 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
10a20 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
10a30 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
10a40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
10a50 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
10a60 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
10a70 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
10a80 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
10a90 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d=%d (dotlock)\n
10aa0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
10ab0 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c  leLock,..   pFil
10ac0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
10ad0 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
10ae0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
10af0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
10b00 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
10b10 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
10b20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10b30 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
10b40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10b50 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
10b60 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  To downgrade to 
10b70 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75  shared, simply u
10b80 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
10b90 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65  al notion of the
10ba0 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  .  ** lock state
10bb0 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65  .  No need to me
10bc0 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ss with the file
10bd0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
10be0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
10bf0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
10c00 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10c10 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
10c20 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
10c30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10c40 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e    /* To fully un
10c50 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
10c60 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  e, delete the lo
10c70 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73  ck file */.  ass
10c80 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
10c90 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20  NO_LOCK );.  rc 
10ca0 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46  = osRmdir(zLockF
10cb0 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30  ile);.  if( rc<0
10cc0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44   && errno==ENOTD
10cd0 49 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69  IR ) rc = osUnli
10ce0 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20  nk(zLockFile);. 
10cf0 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
10d00 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20   int rc = 0;.   
10d10 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
10d20 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f  rno;.    if( ENO
10d30 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  ENT != tErrno ){
10d40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10d50 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
10d60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
10d70 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10d80 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
10d90 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10da0 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
10db0 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
10dc0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10dd0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
10de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10e00 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75  a file.  Make su
10e10 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  re the lock has 
10e20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65  been released be
10e30 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f  fore closing..*/
10e40 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
10e50 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
10e60 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
10e70 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20  nt rc;.  if( id 
10e80 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
10e90 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10ea0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
10eb0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
10ec0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
10ed0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
10ee0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
10ef0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73  .  }.  rc = clos
10f00 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
10f10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
10f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f30 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
10f40 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
10f50 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
11030 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
11040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11060 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
11070 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
11080 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
11090 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
110a0 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
110b0 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
110c0 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
110d0 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
110e0 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
110f0 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
11100 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
11110 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
11120 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
11130 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
11140 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
11150 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
11160 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
11170 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
11180 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
11190 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
111a0 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
111b0 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
111c0 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
111d0 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
111e0 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
111f0 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
11200 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
11210 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
11220 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
11230 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section if SQ
11240 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11250 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72  ING_STYLE is tur
11260 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a  ned off or if.**
11270 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56   compiling for V
11280 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53  XWORKS..*/.#if S
11290 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
112a0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
112b0 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
112c0 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63   Retry flock() c
112d0 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77  alls that fail w
112e0 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66  ith EINTR.*/.#if
112f0 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63  def EINTR.static
11300 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63   int robust_floc
11310 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  k(int fd, int op
11320 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
11330 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64  o{ rc = flock(fd
11340 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,op); }while( rc
11350 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
11360 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
11370 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
11380 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  ine robust_flock
11390 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29  (a,b) flock(a,b)
113a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f  .#endif.     ../
113b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
113c0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
113d0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
113e0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
113f0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
11400 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
11410 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
11420 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
11430 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
11440 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
11450 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
11460 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
11470 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
11480 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
11490 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
114a0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
114b0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
114c0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
114d0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
114e0 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65  tic int flockChe
114f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
11500 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11510 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
11520 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11530 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
11540 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
11550 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11560 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
11570 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11580 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
11590 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
115a0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
115b0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
115c0 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  );.  .  /* Check
115d0 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
115e0 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
115f0 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
11600 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
11610 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
11620 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
11630 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
11640 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
11650 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
11660 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
11670 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
11680 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
11690 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
116a0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
116b0 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74  int lrc = robust
116c0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
116d0 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
116e0 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
116f0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
11700 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
11710 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
11720 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
11730 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
11740 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28  _UN);.      if (
11750 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20   lrc ) {.       
11760 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
11770 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rno;.        /* 
11780 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69  unlock failed wi
11790 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  th an error */. 
117a0 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
117b0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
117c0 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
117d0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
117e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
117f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11800 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
11810 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
11820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11830 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
11840 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11850 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
11860 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
11870 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
11880 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
11890 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
118a0 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
118b0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
118c0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
118d0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
118e0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
118f0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
11900 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11910 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
11920 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
11930 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
11940 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
11950 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
11960 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
11970 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
11980 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69   reserved));..#i
11990 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
119a0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
119b0 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
119c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
119d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
119e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
119f0 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76  E_OK;.    reserv
11a00 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed=1;.  }.#endif
11a10 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
11a20 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
11a30 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75  ORS */.  *pResOu
11a40 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
11a50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11a60 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
11a70 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
11a80 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
11a90 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
11aa0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
11ab0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
11ac0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
11ad0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
11ae0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
11af0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
11b00 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
11b10 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
11b20 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
11b30 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
11b40 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
11b50 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
11b60 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
11b70 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
11b80 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
11b90 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
11ba0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
11bb0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
11bc0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
11bd0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
11be0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
11bf0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
11c00 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
11c10 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
11c20 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
11c30 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
11c40 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
11c50 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
11c60 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
11c70 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
11c80 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
11c90 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
11ca0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
11cb0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11cc0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11cd0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
11ce0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11cf0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
11d00 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
11d10 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f  .**.** flock() o
11d20 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
11d30 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
11d40 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
11d50 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
11d60 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
11d70 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
11d80 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
11d90 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
11da0 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
11db0 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
11dc0 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
11dd0 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
11de0 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
11df0 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
11e00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11e10 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
11e20 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
11e30 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
11e40 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
11e50 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
11e60 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
11e70 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c  tatic int flockL
11e80 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11e90 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
11ea0 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
11eb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11ec0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11ed0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11ee0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11ef0 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20   );..  /* if we 
11f00 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
11f10 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
11f20 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
11f30 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
11f40 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
11f50 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
11f60 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11f70 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
11f80 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11f90 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11fa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11fb0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11fc0 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
11fd0 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
11fe0 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63   if (robust_floc
11ff0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12000 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20  _EX | LOCK_NB)) 
12010 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
12020 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a   = errno;.    /*
12030 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73   didn't get, mus
12040 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20  t be busy */.   
12050 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12060 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12070 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12080 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
12090 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
120a0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
120b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
120c0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
120d0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
120e0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
120f0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
12100 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c  n ok */.    pFil
12110 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
12120 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
12130 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
12140 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63    %d %s %s (floc
12150 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
12160 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
12170 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
12180 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
12190 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
121a0 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ed"));.#ifdef SQ
121b0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
121c0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
121d0 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
121e0 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
121f0 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
12200 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
12210 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
12220 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
12230 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
12240 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
12250 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  .../*.** Lower t
12260 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12270 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
12280 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
12290 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
122a0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
122b0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
122c0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
122d0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
122e0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
122f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
12300 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
12310 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
12320 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
12330 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
12340 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12350 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
12360 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
12370 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
12380 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
12390 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
123a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
123b0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
123c0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
123d0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
123e0 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c  as %d pid=%d (fl
123f0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
12400 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
12410 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
12420 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
12430 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
12440 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
12450 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
12460 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
12470 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
12480 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
12490 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
124a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
124b0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
124c0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
124d0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
124e0 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
124f0 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
12500 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
12510 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
12520 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12530 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
12540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12550 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
12560 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
12570 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f  ock. */.  if( ro
12580 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12590 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b  ->h, LOCK_UN) ){
125a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
125b0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
125c0 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75  _ERRORS.    retu
125d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
125e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
125f0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12600 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72  _ERRORS */.    r
12610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12620 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c  RR_UNLOCK;.  }el
12630 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  se{.    pFile->e
12640 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
12650 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
12660 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
12670 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
12680 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
12690 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  nt flockClose(sq
126a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
126b0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
126c0 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
126d0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  , NO_LOCK);.  }.
126e0 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
126f0 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23  ixFile(id);.}..#
12700 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12710 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12720 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
12730 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RK */../********
12740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
12750 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63  of the flock loc
12760 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
12770 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
12780 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d   Begin Named Sem
12850 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a  aphore Locking *
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12870 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61  *******.**.** Na
12880 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
12890 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75  cking is only su
128a0 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72  pported on VxWor
128b0 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  ks..**.** Semaph
128c0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  ore locking is l
128d0 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64  ike dot-lock and
128e0 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69   flock in that i
128f0 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a  t really only.**
12900 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53   supports EXCLUS
12910 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e  IVE locking.  On
12920 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
12930 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20  ess can read or 
12940 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74  write.** the dat
12950 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20  abase file at a 
12960 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75  time.  This redu
12970 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f  ces potential co
12980 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a  ncurrency, but.*
12990 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b  * makes the lock
129a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
129b0 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a  much easier..*/.
129c0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  #if OS_VXWORKS..
129d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
129e0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
129f0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
12a00 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
12a10 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
12a20 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
12a30 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
12a40 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
12a50 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
12a60 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
12a70 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
12a80 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
12a90 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
12aa0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
12ab0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
12ac0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
12ad0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
12ae0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
12af0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
12b00 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63  atic int semChec
12b10 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12b20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12b30 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
12b40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12b50 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
12b60 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
12b70 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12b80 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
12b90 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
12ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
12bb0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
12bc0 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
12bd0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12be0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
12bf0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
12c00 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
12c10 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
12c20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12c30 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
12c40 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
12c50 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
12c60 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
12c70 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
12c80 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
12c90 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
12ca0 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20  ed ){.    sem_t 
12cb0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
12cc0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20  Inode->pSem;.   
12cd0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
12ce0 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73  tBuf;..    if( s
12cf0 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
12d00 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
12d10 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
12d20 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41  ;.      if( EAGA
12d30 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  IN != tErrno ){.
12d40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12d50 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
12d60 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
12d70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
12d80 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
12d90 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
12da0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12db0 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  o;.      } else 
12dc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d  {.        /* som
12dd0 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68  eone else has th
12de0 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61  e lock when we a
12df0 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f  re in NO_LOCK */
12e00 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65  .        reserve
12e10 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  d = (pFile->eFil
12e20 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c  eLock < SHARED_L
12e30 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
12e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
12e50 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20  * we could have 
12e60 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74  it if we want it
12e70 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f   */.      sem_po
12e80 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a  st(pSem);.    }.
12e90 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
12ea0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
12eb0 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20  %d %d (sem)\n", 
12ec0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
12ed0 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
12ee0 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
12ef0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12f00 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
12f10 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
12f20 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
12f30 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
12f40 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
12f50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
12f60 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
12f70 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
12f80 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
12f90 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
12fa0 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
12fb0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
12fc0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
12fd0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
12fe0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
12ff0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
13000 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
13010 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
13020 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
13030 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
13040 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
13050 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
13060 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
13070 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
13080 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
13090 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
130a0 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
130b0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
130c0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
130d0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
130e0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
130f0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
13100 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
13110 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
13120 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
13130 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
13140 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
13150 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
13160 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
13170 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
13180 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
13190 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
131a0 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
131b0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  SIVE.**.** Semap
131c0 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20  hore locks only 
131d0 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
131e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
131f0 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
13200 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
13210 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
13220 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
13230 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
13240 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
13250 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
13260 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
13270 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
13280 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
13290 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
132a0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
132b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
132c0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
132d0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
132e0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
132f0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
13300 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
13310 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
13320 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71  c int semLock(sq
13330 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13340 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13350 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13360 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13370 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  id;.  int fd;.  
13380 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
13390 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
133a0 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  m;.  int rc = SQ
133b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69  LITE_OK;..  /* i
133c0 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
133d0 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
133e0 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
133f0 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
13400 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
13410 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
13420 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
13430 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
13440 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
13450 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
13460 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ock;.    rc = SQ
13470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
13480 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
13490 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b    }.  .  /* lock
134a0 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62   semaphore now b
134b0 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e  ut bail out when
134c0 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e   already locked.
134d0 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72   */.  if( sem_tr
134e0 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
134f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
13500 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
13510 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
13520 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74    }..  /* got it
13530 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
13540 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
13550 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13560 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13570 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a  . sem_end_lock:.
13580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13590 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
135a0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
135b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
135c0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
135d0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
135e0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
135f0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
13600 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13610 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
13620 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
13630 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
13640 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
13650 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
13660 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
13670 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
13680 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
13690 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c  tatic int semUnl
136a0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
136b0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
136c0 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
136d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
136e0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
136f0 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
13700 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
13710 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  );.  assert( pSe
13730 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  m );.  OSTRACE((
13740 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
13750 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65  as %d pid=%d (se
13760 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
13770 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20   eFileLock,..   
13780 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13790 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
137a0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
137b0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
137c0 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
137d0 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
137e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
137f0 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
13800 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13810 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13820 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
13830 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
13840 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
13850 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
13860 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
13870 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
13880 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
13890 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
138a0 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
138b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
138c0 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
138d0 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ly unlock. */.  
138e0 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53  if ( sem_post(pS
138f0 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  em)==-1 ) {.    
13900 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
13910 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
13920 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
13930 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
13940 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
13950 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
13960 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
13970 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
13980 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
13990 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
139a0 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
139b0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
139c0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
139d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
139e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
139f0 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
13a00 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f  tatic int semClo
13a10 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
13a20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
13a30 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
13a40 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13a50 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55  le*)id;.    semU
13a60 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
13a70 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
13a80 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69  pFile );.    uni
13a90 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
13aa0 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49     releaseInodeI
13ab0 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nfo(pFile);.    
13ac0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
13ad0 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46  ;.    closeUnixF
13ae0 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ile(id);.  }.  r
13af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13b00 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  .}..#endif /* OS
13b10 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a  _VXWORKS */./*.*
13b20 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
13b30 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
13b40 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56  y available on V
13b50 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  xWorks..**.*****
13b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
13b70 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  f the named sema
13b80 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  phore lock imple
13b90 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
13ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
13bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
13c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41  ******** Begin A
13c70 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FP Locking *****
13c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
13ca0 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70  ** AFP is the Ap
13cb0 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f  ple Filing Proto
13cc0 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e  col.  AFP is a n
13cd0 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65  etwork filesyste
13ce0 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70  m found.** on Ap
13cf0 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f  ple Macintosh co
13d00 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f  mputers - both O
13d10 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a  S9 and OSX..**.*
13d20 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d  * Third-party im
13d30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
13d40 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62   AFP are availab
13d50 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f  le.  But this co
13d60 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20  de here.** only 
13d70 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f  works on OSX..*/
13d80 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
13d90 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
13da0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
13db0 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68  G_STYLE./*.** Th
13dc0 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
13dd0 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ext structure co
13de0 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c  ntains all afp l
13df0 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61  ock specific sta
13e00 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  te.*/.typedef st
13e10 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
13e20 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e  ontext afpLockin
13e30 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
13e40 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13e50 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72  xt {.  int reser
13e60 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ved;.  const cha
13e70 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
13e80 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
13e90 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
13ea0 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79  */.};..struct By
13eb0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b  teRangeLockPB2.{
13ec0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13ed0 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20   long offset;   
13ee0 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74       /* offset t
13ef0 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
13f00 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
13f10 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
13f20 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  gth;        /* n
13f30 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  br of bytes to l
13f40 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
13f50 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52  d long long retR
13f60 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62  angeStart; /* nb
13f70 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f  r of 1st byte lo
13f80 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66  cked if successf
13f90 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ul */.  unsigned
13fa0 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67   char unLockFlag
13fb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d  ;         /* 1 =
13fc0 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63   unlock, 0 = loc
13fd0 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
13fe0 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61  char startEndFla
13ff0 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65  g;       /* 1=re
14000 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b  l to end of fork
14010 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74  , 0=rel to start
14020 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20          /* file 
14050 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68  desc to assoc th
14060 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a  is lock with */.
14070 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66  };..#define afpf
14080 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
14090 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57  SCTL        _IOW
140a0 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
140b0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
140c0 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  B2)../*.** This 
140d0 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72  is a utility for
140e0 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61   setting or clea
140f0 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65  ring a bit-range
14100 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41   lock on an.** A
14110 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a  FP filesystem..*
14120 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  * .** Return SQL
14130 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
14140 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  s, SQLITE_BUSY o
14150 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
14160 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c  atic int afpSetL
14170 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ock(.  const cha
14180 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20  r *path,        
14190 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
141a0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
141b0 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b  locked or unlock
141c0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ed */.  unixFile
141d0 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
141e0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
141f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
14200 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69  n path */.  unsi
14210 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
14220 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69  ffset,     /* Fi
14230 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c  rst byte to be l
14240 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  ocked */.  unsig
14250 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
14260 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ngth,     /* Num
14270 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
14280 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65  lock */.  int se
14290 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20  tLockFlag       
142a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
142b0 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46   to set lock.  F
142c0 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f  alse to clear lo
142d0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
142e0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
142f0 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72  B2 pb;.  int err
14300 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b  ;.  .  pb.unLock
14310 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c  Flag = setLockFl
14320 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62  ag ? 0 : 1;.  pb
14330 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20  .startEndFlag = 
14340 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d  0;.  pb.offset =
14350 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65   offset;.  pb.le
14360 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a  ngth = length; .
14370 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d    pb.fd = pFile-
14380 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45  >h;.  .  OSTRACE
14390 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25  (("AFPSETLOCK [%
143a0 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72  s] for %d%s in r
143b0 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e  ange %llx:%llx\n
143c0 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b  ", .    (setLock
143d0 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29  Flag?"ON":"OFF")
143e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e  , pFile->h, (pb.
143f0 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c  fd==-1?"[testval
14400 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66  -1]":""),.    of
14410 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a  fset, length));.
14420 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61    err = fsctl(pa
14430 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e  th, afpfsByteRan
14440 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70  geLock2FSCTL, &p
14450 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72  b, 0);.  if ( er
14460 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  r==-1 ) {.    in
14470 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45  t rc;.    int tE
14480 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
14490 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
144a0 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f  ETLOCK failed to
144b0 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64   fsctl() '%s' %d
144c0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
144d0 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e       path, tErrn
144e0 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72  o, strerror(tErr
144f0 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51  no)));.#ifdef SQ
14500 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
14510 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
14520 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
14530 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  ;.#else.    rc =
14540 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
14550 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
14560 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
14570 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c         setLockFl
14580 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  ag ? SQLITE_IOER
14590 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f  R_LOCK : SQLITE_
145a0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
145b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
145c0 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
145d0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66  ERRORS */.    if
145e0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
145f0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
14600 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
14610 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
14620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
14630 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
14640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14650 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
14660 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
14670 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
14680 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
14690 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
146a0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
146b0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
146c0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
146d0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
146e0 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
146f0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
14700 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
14710 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
14720 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
14730 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
14740 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
14750 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
14760 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
14770 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
14780 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
14790 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
147a0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
147b0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
147c0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
147d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
147e0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
147f0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14800 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14810 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
14820 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20  text *context;. 
14830 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
14840 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
14850 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
14860 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
14870 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
14880 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d  e );.  context =
14890 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
148a0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
148b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
148c0 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
148d0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
148e0 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
148f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14900 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
14910 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
14920 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
14930 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
14940 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
14950 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
14960 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
14970 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
14980 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
14990 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
149a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
149b0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
149c0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
149d0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
149e0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
149f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
14a00 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
14a10 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
14a20 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
14a30 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
14a40 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
14a50 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
14a60 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
14a70 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
14a80 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
14a90 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
14aa0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
14ab0 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
14ac0 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
14ad0 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
14ae0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
14af0 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
14b00 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
14b10 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
14b20 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
14b30 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
14b40 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
14b50 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
14b60 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
14b70 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
14b80 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
14b90 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
14ba0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
14bb0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
14bc0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
14bd0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
14be0 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
14bf0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
14c00 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
14c10 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
14c20 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
14c30 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
14c40 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
14c50 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
14c60 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
14c70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14c80 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
14c90 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
14ca0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
14cb0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
14cc0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
14cd0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
14ce0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
14cf0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
14d00 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
14d10 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
14d20 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
14d30 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
14d40 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
14d50 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
14d60 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
14d70 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
14d80 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
14d90 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
14da0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
14db0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
14dc0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
14dd0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
14de0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
14df0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
14e00 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
14e10 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
14e20 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
14e30 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
14e40 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
14e50 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
14e60 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
14e70 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
14e80 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
14e90 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
14ea0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
14eb0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
14ec0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
14ed0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
14ee0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
14ef0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
14f00 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14f10 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
14f20 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
14f30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14f40 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
14f50 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
14f60 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
14f70 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
14f80 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
14f90 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
14fa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
14fb0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
14fc0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14fd0 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
14fe0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
14ff0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15000 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15010 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
15020 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
15030 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
15040 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
15050 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
15060 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
15070 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
15080 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
15090 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
150a0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
150b0 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
150c0 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
150d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
150e0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
150f0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
15100 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
15110 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
15120 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
15130 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
15140 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
15150 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64  nShared , getpid
15160 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ()));..  /* If t
15170 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
15180 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
15190 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
151a0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
151b0 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
151c0 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
151d0 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
151e0 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
151f0 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
15200 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
15210 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
15220 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
15230 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
15240 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
15250 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
15260 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
15270 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c  ady held) (afp)\
15280 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
15290 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
152a0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
152b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
152c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
152d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
152e0 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
152f0 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a   is correct.  **
15300 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
15310 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
15320 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
15330 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
15340 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
15350 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
15360 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
15370 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
15380 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
15390 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
153a0 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
153b0 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
153c0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
153d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
153e0 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
153f0 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
15400 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
15410 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
15420 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
15430 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
15440 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
15450 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
15460 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
15470 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
15480 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
15490 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
154a0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
154b0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
154c0 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
154d0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
154e0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
154f0 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
15500 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
15510 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
15520 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
15530 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
15540 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
15550 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
15560 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
15570 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
15580 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
15590 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
155a0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
155b0 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f  && .       (pIno
155c0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
155d0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
155e0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
155f0 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20  LOCK)).     ){. 
15600 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15610 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  USY;.    goto af
15620 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
15630 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41    .  /* If a SHA
15640 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
15650 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
15660 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
15670 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
15680 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
15690 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
156a0 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
156b0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
156c0 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
156d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
156e0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
156f0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
15700 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  & .     (pInode-
15710 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
15720 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
15730 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
15740 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
15750 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
15760 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
15770 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
15780 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
15790 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
157a0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
157b0 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
157c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
157d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
157e0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
157f0 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
15800 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
15810 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
15820 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41  .  }.    .  /* A
15830 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
15840 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
15850 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
15860 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
15870 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
15880 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
15890 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
158a0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
158b0 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
158c0 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
158d0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
158e0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
158f0 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
15900 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
15910 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
15920 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
15930 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
15940 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66  nt failed;.    f
15950 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
15960 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15970 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
15980 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
15990 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
159a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
159b0 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  led;.      goto 
159c0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
159d0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
159e0 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
159f0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
15a00 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
15a10 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
15a20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
15a30 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
15a40 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
15a50 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
15a60 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
15a70 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
15a80 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31  lrc1, lrc2, lrc1
15a90 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c  Errno = 0;.    l
15aa0 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20  ong lk, mask;.  
15ab0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
15ac0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
15ad0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
15ae0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
15af0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ck==0 );.       
15b00 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69   .    mask = (si
15b10 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f  zeof(long)==8) ?
15b20 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a   LARGEST_INT64 :
15b30 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
15b40 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
15b50 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44  read-lock SHARED
15b60 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20  _LOCK */.    /* 
15b70 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75  note that the qu
15b80 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e  ality of the ran
15b90 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20  domness doesn't 
15ba0 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68  matter that much
15bb0 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e   */.    lk = ran
15bc0 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f  dom(); .    pIno
15bd0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d  de->sharedByte =
15be0 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48   (lk & mask)%(SH
15bf0 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
15c00 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65      lrc1 = afpSe
15c10 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
15c20 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
15c30 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
15c40 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
15c50 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b  aredByte, 1, 1);
15c60 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
15c70 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a  _ERROR(lrc1) ){.
15c80 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20        lrc1Errno 
15c90 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
15ca0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
15cb0 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
15cc0 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
15cd0 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61   */.    lrc2 = a
15ce0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15cf0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15d00 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
15d10 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20  1, 0);.    .    
15d20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15d30 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20  R(lrc1) ) {.    
15d40 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
15d50 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a  no = lrc1Errno;.
15d60 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
15d70 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
15d80 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
15d90 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b  else if( IS_LOCK
15da0 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a  _ERROR(lrc2) ){.
15db0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b        rc = lrc2;
15dc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
15dd0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
15de0 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d  else if( lrc1 !=
15df0 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20   SQLITE_OK ) {. 
15e00 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
15e10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
15e20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15e30 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
15e40 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
15e50 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
15e60 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
15e70 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
15e80 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
15e90 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
15ea0 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
15eb0 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
15ec0 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
15ed0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
15ee0 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
15ef0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
15f00 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
15f10 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
15f20 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
15f30 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
15f40 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
15f50 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
15f60 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
15f70 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
15f80 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
15f90 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
15fa0 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
15fb0 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
15fc0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
15fd0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
15fe0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
15ff0 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
16000 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
16010 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
16020 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46  ck );.    if (eF
16030 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52  ileLock >= RESER
16040 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
16050 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52  e->eFileLock < R
16060 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
16070 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
16080 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
16090 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
160a0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
160b0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
160c0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
160d0 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20  ED_BYTE, 1,1);. 
160e0 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64       if( !failed
160f0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
16100 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
16110 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16120 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64  .    if (!failed
16130 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d   && eFileLock ==
16140 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
16150 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
16160 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
16170 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
16180 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
16190 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
161a0 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
161b0 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
161c0 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
161d0 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
161e0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
161f0 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
16200 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20  the  afpUnlock. 
16210 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16220 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70  ( !(failed = afp
16230 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16240 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16250 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
16280 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
16290 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
162a0 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
162b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
162c0 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
162d0 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
162e0 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
162f0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
16300 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16310 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16320 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
16330 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ST, .           
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
16360 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
16370 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c   failed && (fail
16380 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  ed2 = afpSetLock
16390 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
163a0 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
163d0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
163e0 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20  te, 1, 1)) ){.  
163f0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74          /* Can't
16400 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
16410 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53   shared lock.  S
16420 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c  qlite can't deal
16430 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  , this is.      
16440 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61      ** a critica
16450 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20  l I/O error.    
16460 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16470 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64     rc = ((failed
16480 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
16490 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
164a0 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20  ) ? failed2 : . 
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
164c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
164d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
164e0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
164f0 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
16500 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
16510 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20   = failed; .    
16520 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
16530 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ( failed ){.    
16540 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
16550 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66     }.  }.  .  if
16560 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16570 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
16580 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
16590 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
165a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
165b0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
165c0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
165d0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
165e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
165f0 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
16600 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
16610 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
16620 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
16630 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a    .afp_end_lock:
16640 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
16650 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
16660 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
16670 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  s (afp)\n", pFil
16680 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
16690 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
166a0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
166b0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
166c0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
166d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
166e0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
166f0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
16700 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
16710 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
16720 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
16730 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
16740 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
16750 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
16760 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
16770 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
16780 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
16790 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
167a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
167b0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
167c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
167d0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
167e0 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
167f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
16800 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
16810 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16820 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
16830 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16840 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
16850 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
16860 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
16870 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
16880 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
16890 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
168a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
168b0 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20   int skipShared 
168c0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
168d0 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20  TE_TEST.  int h 
168e0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64  = pFile->h;.#end
168f0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
16900 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
16910 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
16920 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
16930 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
16940 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
16950 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
16960 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16970 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
16980 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
16990 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
169a0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67  ed,.           g
169b0 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
169c0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
169d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
169e0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
169f0 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
16a00 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
16a10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16a20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16a30 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
16a40 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
16a50 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
16a60 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
16a70 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
16a80 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
16a90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16aa0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16ab0 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
16ac0 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  ck );.    Simula
16ad0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
16ae0 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  1);.    Simulate
16af0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
16b00 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ).    SimulateIO
16b10 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16b20 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44 45      .#ifndef NDE
16b30 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  BUG.    /* When 
16b40 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20  reducing a lock 
16b50 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20  such that other 
16b60 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74  processes can st
16b70 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  art.    ** readi
16b80 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
16b90 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65  file again, make
16ba0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20   sure that the. 
16bb0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
16bc0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  n counter was up
16bd0 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72  dated if any par
16be0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
16bf0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68  e.    ** file ch
16c00 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
16c10 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
16c20 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65  er is not update
16c30 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  d,.    ** other 
16c40 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
16c50 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67  he same file mig
16c60 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  ht not realize t
16c70 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  hat.    ** the f
16c80 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
16c90 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20  and hence might 
16ca0 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73  not know to flus
16cb0 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63  h their.    ** c
16cc0 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f  ache.  The use o
16cd0 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20  f a stale cache 
16ce0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
16cf0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
16d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
16d10 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  rt( pFile->inNor
16d20 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20  malWrite==0.    
16d30 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
16d40 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20  >dbUpdate==0.   
16d50 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
16d60 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
16d70 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  =1 );.    pFile-
16d80 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
16d90 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a   0;.#endif.    .
16da0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65      if( pFile->e
16db0 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
16dc0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
16dd0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
16de0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16df0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
16e00 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53  _FIRST, SHARED_S
16e10 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  IZE, 0);.      i
16e20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16e30 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
16e40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
16e50 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
16e60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16e70 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73  only re-establis
16e80 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
16e90 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  k if necessary *
16ea0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68  /.        int sh
16eb0 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
16ec0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
16ed0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
16ee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
16ef0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16f00 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16f10 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
16f20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65  1, 1);.      } e
16f30 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b  lse {.        sk
16f40 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  ipShared = 1;.  
16f50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16f60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16f70 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
16f80 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
16f90 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
16fa0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16fb0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16fc0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
16fd0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
16fe0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16ff0 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
17000 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45  >eFileLock>=RESE
17010 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e  RVED_LOCK && con
17020 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
17030 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
17040 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17050 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17060 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
17070 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
17080 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20  !rc ){ .        
17090 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
170a0 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a  d = 0; .      }.
170b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
170c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
170d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
170e0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
170f0 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20  ->nShared>1)){. 
17100 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
17110 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
17120 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
17130 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17140 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  _OK && eFileLock
17150 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20  ==NO_LOCK ){..  
17160 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
17170 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
17180 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
17190 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
171a0 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
171b0 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
171c0 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
171d0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
171e0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
171f0 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
17200 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
17210 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
17220 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
17230 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
17240 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
17250 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
17260 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
17270 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
17280 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
17290 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
172a0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
172b0 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
172c0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
172d0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
172e0 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70  .      if( !skip
172f0 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  Shared ){.      
17300 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
17310 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17320 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
17330 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b  LockByte, 1, 0);
17340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17350 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
17360 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
17370 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
17380 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
17390 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
173a0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
173b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
173c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
173d0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
173e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
173f0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
17400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
17410 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
17420 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65  .        closePe
17430 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
17440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17450 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
17460 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
17470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
17480 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17490 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
174a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
174b0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
174c0 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73   & cleanup AFP s
174d0 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20  pecific locking 
174e0 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74  context .*/.stat
174f0 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28  ic int afpClose(
17500 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17510 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
17520 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
17530 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
17540 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
17550 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61  xFile*)id;.    a
17560 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
17570 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
17580 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
17590 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
175a0 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e  de && pFile->pIn
175b0 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  ode->nLock ){.  
175c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
175d0 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
175e0 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
175f0 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
17600 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20   file just.     
17610 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
17620 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
17630 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
17640 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
17650 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
17660 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
17670 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
17680 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
17690 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
176a0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  hen.      ** the
176b0 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
176c0 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
176d0 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
176e0 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
176f0 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
17700 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
17710 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17720 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
17730 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  text);.    rc = 
17740 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
17750 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
17760 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72  Mutex();.  }.  r
17770 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
17780 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
17790 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
177a0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
177b0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
177c0 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
177d0 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   is the AFP lock
177e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
177f0 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
17800 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
17810 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
17820 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
17830 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
17840 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
17850 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
17860 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f   If you don't co
17870 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c  mpile for a mac,
17880 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d   then the "unix-
17890 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e  afp".** VFS is n
178a0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ot available..**
178b0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
178c0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
178d0 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
178e0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
178f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17900 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
17910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
17950 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
17960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
179b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
179c0 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20  gin NFS Locking 
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179f0 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
17a00 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
17a10 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
17a20 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20  NG_STYLE./*. ** 
17a30 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
17a40 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
17a50 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
17a60 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
17a70 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75  eFileLock. ** mu
17a80 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
17a90 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
17aa0 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20  OCK.. **. ** If 
17ab0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17ac0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
17ad0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
17ae0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
17af0 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
17b00 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
17b10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17b20 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74   a no-op.. */.st
17b30 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f  atic int nfsUnlo
17b40 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
17b50 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
17b60 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f  ck){.  return po
17b70 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
17b80 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a  ileLock, 1);.}..
17b90 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
17ba0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
17bb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
17bc0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
17bd0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
17be0 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c  ove is the NFS l
17bf0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
17c00 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
17c10 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
17c20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
17c30 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
17c40 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
17c50 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
17c60 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
17c70 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  e.  .**.********
17c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
17c90 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63  d of the NFS loc
17ca0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
17cb0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
17cc0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
17cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d10 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
17d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d60 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
17d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f  ********* Non-lo
17d80 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69  cking sqlite3_fi
17d90 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le methods *****
17da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17db0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
17dc0 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e  he next division
17dd0 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d   contains implem
17de0 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c  entations for al
17df0 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  l methods of the
17e00 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c   .** sqlite3_fil
17e10 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74  e object other t
17e20 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  han the locking 
17e30 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f  methods.  The lo
17e40 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73  cking.** methods
17e50 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e   were defined in
17e60 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65   divisions above
17e70 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65   (one locking me
17e80 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69  thod per.** divi
17e90 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65  sion).  Those me
17ea0 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63  thods that are c
17eb0 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
17ec0 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72  king modes.** ar
17ed0 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65  e gather togethe
17ee0 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69  r into this divi
17ef0 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  sion..*/../*.** 
17f00 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
17f10 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  et passed as the
17f20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17f30 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  , then read cnt 
17f40 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70  .** bytes into p
17f50 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20  Buf. Return the 
17f60 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17f70 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a  actually read..*
17f80 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75  *.** NB:  If you
17f90 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
17fa0 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34  D or USE_PREAD64
17fb0 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
17fc0 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73  also.** be neces
17fd0 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f  sary to define _
17fe0 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20  XOPEN_SOURCE to 
17ff0 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61  be 500.  This va
18000 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65  ries from.** one
18010 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68   system to anoth
18020 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74  er.  Since SQLit
18030 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e  e does not defin
18040 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61  e USE_PREAD.** a
18050 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64  ny any form by d
18060 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20  efault, we will 
18070 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64  not attempt to d
18080 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
18090 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b  RCE..** See tick
180a0 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32  ets #2741 and #2
180b0 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  681..**.** To av
180c0 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
180d0 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
180e0 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68  a failed read th
180f0 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
18100 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
18110 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
18120 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
18130 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65  AndRead(unixFile
18140 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
18150 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64  t64 offset, void
18160 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
18170 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66  {.  int got;.#if
18180 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
18190 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
181a0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
181b0 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
181c0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
181d0 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
181e0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
181f0 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65 61  do{ got = osPrea
18200 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
18210 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
18220 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
18230 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
18240 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18250 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
18260 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
18270 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f  READ64).  do{ go
18280 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64  t = osPread64(id
18290 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
182a0 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28  offset); }while(
182b0 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
182c0 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d 75 6c  =EINTR);.  Simul
182d0 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
182e0 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
182f0 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
18300 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
18310 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69   SEEK_SET);.  Si
18320 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
18330 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
18340 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f  if( newOffset!=o
18350 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28  ffset ){.    if(
18360 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
18370 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78   ){.      ((unix
18380 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18390 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
183a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28    }else{.      (
183b0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
183c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09  lastErrno = 0;..
183d0 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ..    }.    retu
183e0 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f 7b  rn -1;.  }.  do{
183f0 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64   got = osRead(id
18400 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
18410 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
18420 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
18430 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
18440 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
18450 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
18460 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18470 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
18480 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
18490 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
184a0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
184b0 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
184c0 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
184d0 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
184e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
184f0 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
18500 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
18510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18520 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
18530 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
18540 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
18550 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
18560 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18570 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
18580 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
18590 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
185a0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
185b0 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
185c0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
185d0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
185e0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
185f0 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f  e *)id;.  int go
18600 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
18610 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
18620 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
18630 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
18640 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
18650 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
18660 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
18670 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
18680 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
18690 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
186a0 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
186b0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
186c0 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
186d0 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
186e0 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
186f0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
18700 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
18710 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
18720 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
18730 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
18740 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
18750 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
18760 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18770 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
18780 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
18790 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
187a0 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
187b0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
187c0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
187d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
187e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
187f0 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
18800 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
18810 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
18820 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
18830 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
18840 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
18850 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
18860 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
18870 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
18880 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
18890 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
188a0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
188b0 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
188c0 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
188d0 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
188e0 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
188f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18900 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
18910 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
18920 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
18930 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
18940 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
18950 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
18960 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
18970 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
18980 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
18990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
189a0 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
189b0 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
189c0 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
189d0 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
189e0 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28    int got;.#if (
189f0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
18a00 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
18a10 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
18a20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
18a30 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
18a40 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
18a50 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f  (USE_PREAD).  do
18a60 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65  { got = osPwrite
18a70 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18a80 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69  t, offset); }whi
18a90 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
18aa0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#el
18ab0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
18ac0 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f  READ64).  do{ go
18ad0 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69  t = osPwrite64(i
18ae0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
18af0 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28   offset);}while(
18b00 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
18b10 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20  =EINTR);.#else. 
18b20 20 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66 73   do{.    newOffs
18b30 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
18b40 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
18b50 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
18b60 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66  eIOError( newOff
18b70 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28  set-- );.    if(
18b80 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
18b90 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  et ){.      if( 
18ba0 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
18bb0 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69  ){.        ((uni
18bc0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18bd0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
18be0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18bf0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18c00 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18c10 20 30 3b 09 09 09 0a 20 20 20 20 20 20 7d 0a 20   0;....      }. 
18c20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
18c30 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20      }.    got = 
18c40 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  osWrite(id->h, p
18c50 42 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77 68  Buf, cnt);.  }wh
18c60 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
18c70 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
18c80 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44  ndif.  TIMER_END
18c90 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  ;.  if( got<0 ){
18ca0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
18cb0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
18cc0 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20  = errno;.  }..  
18cd0 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
18ce0 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
18cf0 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c   %llu\n", id->h,
18d00 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49   got, offset, TI
18d10 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
18d20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a   return got;.}..
18d30 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
18d40 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
18d50 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
18d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
18d70 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
18d80 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
18d90 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
18da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18db0 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c  unixWrite(.  sql
18dc0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
18dd0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
18de0 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
18df0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
18e00 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69  offset .){.  uni
18e10 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
18e20 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
18e30 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20  int wrote = 0;. 
18e40 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
18e50 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
18e60 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
18e70 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
18e80 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
18e90 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
18ea0 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
18eb0 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
18ec0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
18ed0 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
18ee0 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
18ef0 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
18f00 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
18f10 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
18f20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
18f30 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
18f40 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
18f50 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
18f60 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
18f70 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
18f80 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
18f90 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
18fa0 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
18fb0 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
18fc0 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
18fd0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
18fe0 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
18ff0 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
19000 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
19010 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
19020 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
19030 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
19040 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
19050 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
19060 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
19070 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
19080 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
19090 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
190a0 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
190b0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
190c0 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
190d0 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
190e0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
190f0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
19100 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
19110 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
19120 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
19130 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
19140 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
19150 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
19160 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
19170 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
19180 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
19190 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
191a0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
191b0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
191c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
191d0 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
191e0 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
191f0 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
19200 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
19210 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
19220 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
19230 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
19240 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
19250 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
19260 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
19270 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
19280 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e   (wrote = seekAn
19290 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66  dWrite(pFile, of
192a0 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
192b0 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  )>0 ){.    amt -
192c0 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
192d0 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
192e0 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
192f0 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
19300 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
19310 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
19320 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
19330 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
19340 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
19350 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66   amt=1 ));..  if
19360 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
19370 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46  f( wrote<0 && pF
19380 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d  ile->lastErrno!=
19390 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20  ENOSPC ){.      
193a0 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
193b0 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
193c0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
193d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
193e0 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
193f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
19400 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e  tErrno = 0; /* n
19410 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
19420 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
19430 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
19440 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
19450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19460 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19470 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
19480 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
19490 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
194a0 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
194b0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
194c0 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
194d0 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
194e0 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
194f0 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
19500 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
19510 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
19520 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
19530 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
19540 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
19550 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
19560 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
19570 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
19580 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
19590 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
195a0 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
195b0 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
195c0 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
195d0 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
195e0 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
195f0 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
19600 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
19610 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
19620 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
19630 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
19640 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
19650 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66  sync.*/.#if !def
19660 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 0a  ined(fdatasync).
19670 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
19680 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
19690 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
196a0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
196b0 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
196c0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
196d0 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
196e0 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
196f0 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
19700 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
19710 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
19720 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
19730 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
19740 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
19750 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
19760 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
19770 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
19780 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
19790 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
197a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
197b0 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
197c0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
197d0 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
197e0 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
197f0 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
19800 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
19810 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
19820 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
19830 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
19840 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
19850 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
19860 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
19870 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
19880 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
19890 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
198a0 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
198b0 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
198c0 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
198d0 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
198e0 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
198f0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
19900 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
19910 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
19920 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
19930 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
19940 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
19950 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
19960 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
19970 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
19980 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
19990 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
199a0 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
199b0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
199c0 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
199d0 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
199e0 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
199f0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
19a00 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
19a10 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
19a20 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
19a30 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
19a40 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
19a50 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
19a60 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
19a70 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
19a80 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
19a90 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
19aa0 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
19ab0 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
19ac0 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
19ad0 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
19ae0 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
19af0 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
19b00 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
19b10 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
19b20 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
19b30 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
19b40 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
19b50 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
19b60 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
19b70 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
19b80 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
19b90 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
19ba0 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
19bb0 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
19bc0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
19bd0 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
19be0 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
19bf0 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
19c00 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
19c10 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
19c20 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
19c30 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
19c40 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
19c50 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
19c60 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
19c70 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
19c80 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
19c90 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
19ca0 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
19cb0 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
19cc0 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
19cd0 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
19ce0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
19cf0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
19d00 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
19d10 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
19d20 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
19d30 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
19d40 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
19d50 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
19d60 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
19d70 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
19d80 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
19d90 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
19da0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
19db0 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
19dc0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
19dd0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
19de0 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
19df0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
19e00 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
19e10 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
19e20 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
19e30 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
19e40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
19e50 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
19e60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19e70 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
19e80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19e90 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
19ea0 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
19eb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
19ec0 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
19ed0 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
19ee0 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
19ef0 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
19f00 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
19f10 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
19f20 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
19f30 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
19f40 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
19f50 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
19f60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19f70 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
19f80 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
19f90 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
19fa0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
19fb0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
19fc0 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
19fd0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
19fe0 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
19ff0 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
1a000 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
1a010 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a020 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53  NO_SYNC.  rc = S
1a030 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20  QLITE_OK;.#elif 
1a040 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1a050 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
1a060 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
1a070 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
1a080 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
1a090 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
1a0a0 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
1a0b0 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
1a0c0 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
1a0d0 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
1a0e0 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
1a0f0 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
1a100 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
1a110 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
1a120 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
1a130 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
1a140 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
1a150 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
1a160 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
1a170 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
1a180 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
1a190 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
1a1a0 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
1a1b0 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
1a1c0 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
1a1d0 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
1a1e0 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
1a1f0 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
1a200 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
1a210 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
1a220 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
1a230 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
1a240 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
1a250 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
1a260 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
1a270 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
1a280 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1a290 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
1a2a0 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
1a2b0 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
1a2c0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
1a2d0 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
1a2e0 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
1a2f0 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
1a300 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
1a310 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
1a320 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
1a330 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
1a340 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
1a350 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
1a360 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
1a370 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
1a380 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
1a390 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
1a3a0 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
1a3b0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1a3c0 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
1a3d0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1a3e0 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
1a3f0 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
1a400 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
1a410 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
1a420 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
1a430 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a440 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
1a450 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
1a460 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1a470 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
1a480 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
1a490 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
1a4a0 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
1a4b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1a4c0 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1a4d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1a4e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1a4f0 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
1a500 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
1a510 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
1a520 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
1a530 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
1a540 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
1a550 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65  ..**.** The dire
1a560 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1a570 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  iptor is used fo
1a580 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67  r only one thing
1a590 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29   - to.** fsync()
1a5a0 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20   a directory to 
1a5b0 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63  make sure file c
1a5c0 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65  reation and dele
1a5d0 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61  tion events.** a
1a5e0 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  re flushed to di
1a5f0 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73  sk.  Such fsyncs
1a600 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20   are not needed 
1a610 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72  on newer.** jour
1a620 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65  naling filesyste
1a630 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75  ms, but are requ
1a640 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69  ired on older fi
1a650 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a  lesystems..**.**
1a660 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1a670 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
1a680 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79  using the xSetSy
1a690 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  sCall interface.
1a6a0 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20  .** The ability 
1a6b0 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  to override this
1a6c0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64   routine was add
1a6d0 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66  ed in support of
1a6e0 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d   the.** chromium
1a6f0 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69   sandbox.  Openi
1a700 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  ng a directory i
1a710 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73  s a security ris
1a720 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c  k (we are.** tol
1a730 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20  d) so making it 
1a740 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c  overrideable all
1a750 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d  ows the chromium
1a760 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72   sandbox to.** r
1a770 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74  eplace this rout
1a780 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c  ine with a harml
1a790 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d  ess no-op.  To m
1a7a0 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ake this routine
1a7b0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70  .** a no-op, rep
1a7c0 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73  lace it with a s
1a7d0 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73  tub that returns
1a7e0 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1a7f0 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65  eaves.** *pFd se
1a800 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20  t to a negative 
1a810 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  number..**.** If
1a820 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1a830 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  turned, the call
1a840 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1a850 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a  e for closing.**
1a860 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1a870 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20  ptor *pFd using 
1a880 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
1a890 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
1a8a0 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  tory(const char 
1a8b0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
1a8c0 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b  *pFd){.  int ii;
1a8d0 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
1a8e0 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b    char zDirname[
1a8f0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
1a900 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
1a910 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
1a920 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73  E, zDirname, "%s
1a930 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
1a940 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72   for(ii=(int)str
1a950 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
1a960 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b  i>1 && zDirname[
1a970 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b  ii]!='/'; ii--);
1a980 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20  .  if( ii>0 ){. 
1a990 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20     zDirname[ii] 
1a9a0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d  = '\0';.    fd =
1a9b0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1a9c0 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1a9d0 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1a9e0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23    if( fd>=0 ){.#
1a9f0 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
1aa00 0a 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  .      osFcntl(f
1aa10 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
1aa20 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
1aa30 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
1aa40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1aa50 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
1aa60 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
1aa70 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
1aa80 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
1aa90 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
1aaa0 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75  d>=0?SQLITE_OK:u
1aab0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1aac0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1aad0 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61  , "open", zDirna
1aae0 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  me));.}../*.** M
1aaf0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1ab00 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1ab10 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1ab20 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1ab30 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1ab40 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1ab50 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1ab60 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1ab70 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1ab80 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1ab90 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1aba0 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1abb0 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1abc0 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1abd0 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1abe0 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1abf0 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1ac00 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1ac10 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1ac20 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1ac30 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1ac40 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1ac50 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1ac60 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1ac70 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1ac80 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1ac90 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1aca0 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1acb0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1acc0 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1acd0 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1ace0 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1acf0 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1ad00 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1ad10 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1ad20 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1ad30 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1ad40 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1ad50 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1ad60 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1ad70 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1ad80 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1ad90 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1ada0 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1adb0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1adc0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1add0 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1ade0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1adf0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1ae00 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1ae10 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1ae20 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1ae30 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1ae40 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1ae50 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1ae60 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1ae70 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1ae80 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1ae90 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1aea0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1aeb0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1aec0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1aed0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1aee0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1aef0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1af00 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1af10 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1af20 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1af30 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1af40 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1af50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1af60 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1af70 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1af80 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1af90 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1afa0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1afb0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1afc0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1afd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1afe0 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1aff0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1b000 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1b010 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1b020 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1b030 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1b040 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1b050 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1b060 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1b070 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1b080 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1b090 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1b0a0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1b0b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1b0c0 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1b0d0 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1b0e0 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ath);.  }..  /* 
1b0f0 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64  Also fsync the d
1b100 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1b110 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20  ing the file if 
1b120 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67  the DIRSYNC flag
1b130 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54  .  ** is set.  T
1b140 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d  his is a one-tim
1b150 65 20 6f 63 63 75 72 72 61 6e 63 65 2e 20 20 4d  e occurrance.  M
1b160 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61  any systems (exa
1b170 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a  mples: AIX).  **
1b180 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66   are unable to f
1b190 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79  sync a directory
1b1a0 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f  , so ignore erro
1b1b0 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e  rs on the fsync.
1b1c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1b1d0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1b1e0 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
1b1f0 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64  ){.    int dirfd
1b200 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1b210 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65  DIRSYNC %s (have
1b220 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1b230 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1b240 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20  File->zPath,.   
1b250 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1b260 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1b270 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync));.    rc = 
1b280 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
1b290 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64  pFile->zPath, &d
1b2a0 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1b2b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b2c0 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
1b2d0 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72    full_fsync(dir
1b2e0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
1b2f0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1b300 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49  ile, dirfd, __LI
1b310 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
1b320 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b330 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
1b340 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1b360 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1b370 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e  ~UNIXFILE_DIRSYN
1b380 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
1b390 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
1b3a0 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
1b3b0 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
1b3c0 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
1b3d0 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1b3e0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1b3f0 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
1b400 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1b410 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1b420 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
1b430 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1b440 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1b450 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1b460 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1b470 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1b480 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1b490 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1b4a0 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1b4b0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1b4c0 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
1b4d0 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
1b4e0 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1b4f0 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
1b500 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
1b510 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
1b520 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
1b530 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
1b540 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
1b550 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
1b560 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1b570 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79  Chunk ){.    nBy
1b580 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
1b590 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
1b5a0 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
1b5b0 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
1b5c0 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  unk;.  }..  rc =
1b5d0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1b5e0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66  e(pFile->h, (off
1b5f0 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  _t)nByte);.  if(
1b600 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
1b610 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1b620 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1b630 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1b640 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1b650 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
1b660 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1b670 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66    }else{.#ifndef
1b680 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49   NDEBUG.    /* I
1b690 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1b6a0 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1b6b0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1b6c0 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1b6d0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1b6e0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1b6f0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1b700 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1b710 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1b720 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1b730 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1b740 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1b750 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1b760 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1b770 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1b780 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1b790 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1b7a0 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1b7b0 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1b7c0 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1b7d0 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1b7e0 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1b7f0 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1b800 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
1b810 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1b820 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
1b830 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  .      pFile->tr
1b840 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1b850 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1b860 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b870 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
1b880 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
1b890 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
1b8a0 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
1b8b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1b8c0 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  ixFileSize(sqlit
1b8d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1b8e0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
1b8f0 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  rc;.  struct sta
1b900 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28  t buf;.  assert(
1b910 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73   id );.  rc = os
1b920 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  Fstat(((unixFile
1b930 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b  *)id)->h, &buf);
1b940 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1b950 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1b960 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28  ( rc!=0 ){.    (
1b970 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1b980 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1b990 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
1b9a0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1b9b0 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
1b9c0 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20   buf.st_size;.. 
1b9d0 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67   /* When opening
1b9e0 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74   a zero-size dat
1b9f0 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49  abase, the findI
1ba00 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65  nodeInfo() proce
1ba10 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73  dure.  ** writes
1ba20 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1ba30 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e  nto that file in
1ba40 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61   order to work a
1ba50 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a  round a bug.  **
1ba60 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64   in the OS-X msd
1ba70 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  os filesystem.  
1ba80 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  In order to avoi
1ba90 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  d problems with 
1baa0 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72  upper.  ** layer
1bab0 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  s, we need to re
1bac0 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73  port this file s
1bad0 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e  ize as zero even
1bae0 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20   though it is.  
1baf0 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54  ** really 1.   T
1bb00 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a  icket #3260..  *
1bb10 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d  /.  if( *pSize==
1bb20 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a  1 ) *pSize = 0;.
1bb30 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1bb40 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
1bb50 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1bb60 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1bb70 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
1bb80 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72  *.** Handler for
1bb90 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66   proxy-locking f
1bba0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62  ile-control verb
1bbb0 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f  s.  Defined belo
1bbc0 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78  w in the.** prox
1bbd0 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76  ying locking div
1bbe0 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ision..*/.static
1bbf0 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f   int proxyFileCo
1bc00 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1bc10 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a  le*,int,void*);.
1bc20 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54  #endif../* .** T
1bc30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1bc40 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65  called to handle
1bc50 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
1bc60 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20  L_SIZE_HINT .** 
1bc70 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65  file-control ope
1bc80 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65  ration.  Enlarge
1bc90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
1bca0 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a   nBytes in size.
1bcb0 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74  ** (rounded up t
1bcc0 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b  o the next chunk
1bcd0 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20  -size).  If the 
1bce0 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
1bcf0 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72  ady.** nBytes or
1bd00 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f   larger, this ro
1bd10 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1bd20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bd30 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e  fcntlSizeHint(un
1bd40 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
1bd50 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28  64 nByte){.  if(
1bd60 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
1bd70 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69  0 ){.    i64 nSi
1bd80 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1bd90 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
1bda0 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ed file size */.
1bdb0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1bdc0 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
1bdd0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c    /* Used to hol
1bde0 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  d return values 
1bdf0 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20  of fstat() */.  
1be00 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61   .    if( osFsta
1be10 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
1be20 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1be30 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a  E_IOERR_FSTAT;..
1be40 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42      nSize = ((nB
1be50 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75  yte+pFile->szChu
1be60 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73  nk-1) / pFile->s
1be70 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1be80 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66  >szChunk;.    if
1be90 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66  ( nSize>(i64)buf
1bea0 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66  .st_size ){..#if
1beb0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
1bec0 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
1bed0 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
1bee0 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20  LOCATE.      /* 
1bef0 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69  The code below i
1bf00 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72  s handling the r
1bf10 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f  eturn value of o
1bf20 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20  sFallocate() .  
1bf30 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79      ** correctly
1bf40 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  . posix_fallocat
1bf50 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  e() is defined t
1bf60 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  o "returns zero 
1bf70 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20  on success, .   
1bf80 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f     ** or an erro
1bf90 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69  r number on  fai
1bfa0 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d  lure". See the m
1bfb0 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69  anpage for detai
1bfc0 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ls. */.      int
1bfd0 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a   err;.      do{.
1bfe0 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73          err = os
1bff0 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d  Fallocate(pFile-
1c000 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c  >h, buf.st_size,
1c010 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69   nSize-buf.st_si
1c020 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ze);.      }whil
1c030 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b  e( err==EINTR );
1c040 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29  .      if( err )
1c050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1c060 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73  OERR_WRITE;.#els
1c070 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  e.      /* If th
1c080 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61  e OS does not ha
1c090 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  ve posix_falloca
1c0a0 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 46  te(), fake it. F
1c0b0 69 72 73 74 20 75 73 65 0a 20 20 20 20 20 20 2a  irst use.      *
1c0c0 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  * ftruncate() to
1c0d0 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 73 69   set the file si
1c0e0 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ze, then write a
1c0f0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a   single byte to.
1c100 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
1c110 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62  t byte in each b
1c120 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20  lock within the 
1c130 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e  extended region.
1c140 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
1c150 73 20 74 68 65 20 73 61 6d 65 20 74 65 63 68 6e  s the same techn
1c160 69 71 75 65 20 75 73 65 64 20 62 79 20 67 6c 69  ique used by gli
1c170 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  bc to implement 
1c180 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1c190 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79  ).      ** on sy
1c1a0 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f  stems that do no
1c1b0 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61  t have a real fa
1c1c0 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65 6d  llocate() system
1c1d0 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a   call..      */.
1c1e0 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d        int nBlk =
1c1f0 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b   buf.st_blksize;
1c200 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d    /* File-system
1c210 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20   block size */. 
1c220 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b       i64 iWrite;
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c240 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20   /* Next offset 
1c250 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a  to write to */..
1c260 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
1c270 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1c280 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20  ->h, nSize) ){. 
1c290 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
1c2a0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1c2b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c2c0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1c2d0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1c2e0 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
1c2f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1c300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 57        }.      iW
1c310 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74 5f  rite = ((buf.st_
1c320 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20  size + 2*nBlk - 
1c330 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b  1)/nBlk)*nBlk-1;
1c340 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 57  .      while( iW
1c350 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20  rite<nSize ){.  
1c360 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
1c370 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1c380 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22  pFile, iWrite, "
1c390 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ", 1);.        i
1c3a0 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72  f( nWrite!=1 ) r
1c3b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1c3c0 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20  RR_WRITE;.      
1c3d0 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b    iWrite += nBlk
1c3e0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1c3f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1c400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c410 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61  }../*.** Informa
1c420 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c  tion and control
1c430 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65   of an open file
1c440 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
1c450 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43  ic int unixFileC
1c460 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1c470 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
1c480 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
1c490 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1c4a0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1c4b0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1c4c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c4d0 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
1c4e0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1c4f0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65  )pArg = pFile->e
1c500 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  FileLock;.      
1c510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c530 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
1c540 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
1c550 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
1c560 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
1c570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c580 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1c590 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1c5a0 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20  CHUNK_SIZE: {.  
1c5b0 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75      pFile->szChu
1c5c0 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72  nk = *(int *)pAr
1c5d0 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  g;.      return 
1c5e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c5f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c600 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1c610 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
1c620 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1c630 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1c640 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e  ;.      rc = fcn
1c650 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65  tlSizeHint(pFile
1c660 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b  , *(i64 *)pArg);
1c670 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1c680 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1c690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1c6a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c6b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
1c6c0 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20  RSIST_WAL: {.   
1c6d0 20 20 20 69 6e 74 20 62 50 65 72 73 69 73 74 20     int bPersist 
1c6e0 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20  = *(int*)pArg;. 
1c6f0 20 20 20 20 20 69 66 28 20 62 50 65 72 73 69 73       if( bPersis
1c700 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  t<0 ){.        *
1c710 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 70 46  (int*)pArg = (pF
1c720 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1c730 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
1c740 54 5f 57 41 4c 29 21 3d 30 3b 0a 20 20 20 20 20  T_WAL)!=0;.     
1c750 20 7d 65 6c 73 65 20 69 66 28 20 62 50 65 72 73   }else if( bPers
1c760 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
1c770 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1c780 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f  gs &= ~UNIXFILE_
1c790 50 45 52 53 49 53 54 5f 57 41 4c 3b 0a 20 20 20  PERSIST_WAL;.   
1c7a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c7b0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1c7c0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
1c7d0 45 52 53 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20  ERSIST_WAL;.    
1c7e0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1c7f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c800 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
1c810 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
1c820 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
1c830 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
1c840 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
1c850 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
1c860 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
1c870 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
1c880 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
1c890 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
1c8a0 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
1c8b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1c8c0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
1c8d0 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
1c8e0 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
1c8f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1c900 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
1c910 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
1c920 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
1c930 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
1c940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c950 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1c960 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1c970 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1c980 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1c990 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
1c9a0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
1c9b0 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
1c9c0 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
1c9d0 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
1c9e0 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c   return proxyFil
1c9f0 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70  eControl(id,op,p
1ca00 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Arg);.    }.#end
1ca10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1ca20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1ca30 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1ca40 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63  PPLE__) */.    c
1ca50 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ca60 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b  _SYNC_OMITTED: {
1ca70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ca80 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e  LITE_OK;  /* A n
1ca90 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  o-op */.    }.  
1caa0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1cab0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
1cac0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cad0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
1cae0 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
1caf0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
1cb00 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
1cb10 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
1cb20 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
1cb30 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
1cb40 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
1cb50 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
1cb60 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
1cb70 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
1cb80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1cb90 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
1cba0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
1cbb0 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
1cbc0 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
1cbd0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
1cbe0 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
1cbf0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
1cc00 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
1cc10 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
1cc20 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
1cc30 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
1cc40 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
1cc50 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
1cc60 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1cc70 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
1cc80 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1cc90 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1cca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
1ccb0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
1ccc0 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
1ccd0 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68  rn the device ch
1cce0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f  aracteristics fo
1ccf0 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  r the file. This
1cd00 20 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72   is always 0 for
1cd10 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   unix..*/.static
1cd20 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43   int unixDeviceC
1cd30 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
1cd40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
1cd50 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
1cd60 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1cd70 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  d);.  return 0;.
1cd80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1cd90 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a  E_OMIT_WAL.../*.
1cda0 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  ** Object used t
1cdb0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73  o represent an s
1cdc0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66  hared memory buf
1cdd0 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  fer.  .**.** Whe
1cde0 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
1cdf0 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
1ce00 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e   the same wal-in
1ce10 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64  dex, each thread
1ce20 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20  .** has its own 
1ce30 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20  unixShm object, 
1ce40 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69  but they all poi
1ce50 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
1ce60 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68  nstance.** of th
1ce70 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
1ce80 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
1ce90 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c   words, each wal
1cea0 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64  -index is opened
1ceb0 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  .** only once pe
1cec0 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
1ced0 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64   Each unixShmNod
1cee0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e  e object is conn
1cef0 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c  ected to a singl
1cf00 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
1cf10 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f  object..** We co
1cf20 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69  uld coalesce thi
1cf30 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e  s object into un
1cf40 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74  ixInodeInfo, but
1cf50 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e   that would mean
1cf60 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66  .** every open f
1cf70 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ile that does no
1cf80 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d  t use shared mem
1cf90 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f  ory (in other wo
1cfa0 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65  rds, most.** ope
1cfb0 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68  n files) would h
1cfc0 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f  ave to carry aro
1cfd0 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69  und this extra i
1cfe0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a  nformation.  So.
1cff0 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ** the unixInode
1d000 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74  Info object cont
1d010 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
1d020 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  o this unixShmNo
1d030 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64  de object.** and
1d040 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1d050 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
1d060 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65  ed only when nee
1d070 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d  ded..**.** unixM
1d080 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
1d090 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
1d0a0 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
1d0b0 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
1d0c0 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
1d0d0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1d0e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1d0f0 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
1d100 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  nRef.**.** The f
1d110 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
1d120 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
1d130 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
1d140 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a  s created:.** .*
1d150 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
1d160 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
1d170 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68  ** Either unixSh
1d180 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74  mNode.mutex must
1d190 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78   be held or unix
1d1a0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
1d1b0 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  and.** unixMutex
1d1c0 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
1d1d0 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
1d1e0 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
1d1f0 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
1d200 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  s structure..*/.
1d210 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
1d220 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  de {.  unixInode
1d230 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
1d240 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e    /* unixInodeIn
1d250 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69  fo that owns thi
1d260 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20  s SHM node */.  
1d270 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
1d280 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
1d290 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
1d2a0 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
1d2b0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
1d2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1d2d0 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64  e of the mmapped
1d2e0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68   file */.  int h
1d2f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d300 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
1d310 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
1d320 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
1d330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d340 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
1d350 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
1d360 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b  /.  u16 nRegion;
1d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d380 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
1d390 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38  apRegion */.  u8
1d3a0 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20   isReadonly;    
1d3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1d3c0 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f   if read-only */
1d3d0 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69  .  char **apRegi
1d3e0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
1d3f0 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64   Array of mapped
1d400 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1d410 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
1d420 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1d430 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d440 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65   of unixShm obje
1d450 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
1d460 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  this */.  unixSh
1d470 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
1d480 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78       /* All unix
1d490 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
1d4a0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
1d4b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1d4c0 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
1d4d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1d4e0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
1d4f0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
1d500 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
1d510 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1d520 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
1d530 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
1d540 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d560 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
1d570 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
1d580 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
1d590 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
1d5a0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
1d5b0 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
1d5c0 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
1d5d0 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
1d5e0 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
1d5f0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1d600 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
1d610 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
1d620 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
1d630 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
1d640 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
1d650 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
1d660 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  *.**    unixShm.
1d670 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78  pFile.**    unix
1d680 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
1d690 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
1d6a0 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
1d6b0 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65  he unixShm.pFile
1d6c0 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
1d6d0 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
1d6e0 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
1d6f0 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
1d700 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
1d710 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65   {.  unixShmNode
1d720 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
1d730 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1d740 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  g unixShmNode ob
1d750 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ject */.  unixSh
1d760 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
1d770 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69       /* Next uni
1d780 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  xShm with the sa
1d790 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  me unixShmNode *
1d7a0 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d7c0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
1d7d0 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  g the unixShmNod
1d7e0 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20  e mutex */.  u8 
1d7f0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
1d800 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
1d810 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1d820 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78   within its unix
1d830 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36  ShmNode */.  u16
1d840 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
1d850 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1d860 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
1d870 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78  held */.  u16 ex
1d880 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
1d890 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1d8a0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1d8b0 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  held */.};../*.*
1d8c0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
1d8d0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
1d8e0 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
1d8f0 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
1d900 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
1d910 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  )         /* fir
1d920 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
1d930 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
1d940 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48  _DMS    (UNIX_SH
1d950 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
1d960 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
1d970 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
1d980 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69  /*.** Apply posi
1d990 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  x advisory locks
1d9a0 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66   for all bytes f
1d9b0 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68  rom ofst through
1d9c0 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a   ofst+n-1..**.**
1d9d0 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20   Locks block if 
1d9e0 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63  the mask is exac
1d9f0 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61  tly UNIX_SHM_C a
1da00 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b  nd are non-block
1da10 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ing.** otherwise
1da20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1da30 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1da40 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  k(.  unixShmNode
1da50 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41   *pShmNode, /* A
1da60 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
1da70 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
1da80 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
1da90 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c  .  int lockType,
1daa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55            /* F_U
1dab0 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f  NLCK, F_RDLCK, o
1dac0 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  r F_WRLCK */.  i
1dad0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
1dae0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
1daf0 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  yte of the locki
1db00 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  ng range */.  in
1db10 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  t n             
1db20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1db30 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
1db40 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
1db50 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a  lock f;       /*
1db60 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   The posix advis
1db70 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ory locking stru
1db80 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72  cture */.  int r
1db90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1dba0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1dbb0 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a  form fcntl() */.
1dbc0 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
1dbd0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1dbe0 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
1dbf0 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
1dc00 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
1dc10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1dc20 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
1dc30 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ex) || pShmNode-
1dc40 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
1dc50 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e  * Shared locks n
1dc60 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74  ever span more t
1dc70 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a  han one byte */.
1dc80 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
1dc90 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44  | lockType!=F_RD
1dca0 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  LCK );..  /* Loc
1dcb0 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ks are within ra
1dcc0 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nge */.  assert(
1dcd0 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54   n>=1 && n<SQLIT
1dce0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a  E_SHM_NLOCK );..
1dcf0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1dd00 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  h>=0 ){.    /* I
1dd10 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
1dd20 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
1dd30 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
1dd40 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29  f, 0, sizeof(f))
1dd50 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d  ;.    f.l_type =
1dd60 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66   lockType;.    f
1dd70 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
1dd80 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74  _SET;.    f.l_st
1dd90 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20  art = ofst;.    
1dda0 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20  f.l_len = n;..  
1ddb0 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
1ddc0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45  ShmNode->h, F_SE
1ddd0 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63  TLK, &f);.    rc
1dde0 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20   = (rc!=(-1)) ? 
1ddf0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
1de00 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
1de10 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c  /* Update the gl
1de20 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20  obal lock state 
1de30 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61  and do debug tra
1de40 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53  cing */.#ifdef S
1de50 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20  QLITE_DEBUG.  { 
1de60 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52  u16 mask;.  OSTR
1de70 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22  ACE(("SHM-LOCK "
1de80 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  ));.  mask = (1<
1de90 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
1dea0 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63  <ofst);.  if( rc
1deb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dec0 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
1ded0 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
1dee0 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
1def0 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
1df00 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
1df10 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
1df20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
1df30 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
1df40 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
1df50 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
1df60 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
1df70 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
1df80 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  ad-lock %d ok", 
1df90 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
1dfa0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1dfb0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1dfc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
1dfd0 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
1dfe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dff0 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
1e000 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
1e010 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
1e020 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  te-lock %d ok", 
1e030 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
1e040 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1e050 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
1e060 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1e070 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1e080 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1e090 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
1e0a0 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
1e0b0 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
1e0c0 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
1e0d0 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  st));.    }else 
1e0e0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
1e0f0 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
1e100 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
1e110 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ck failed"));.  
1e120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1e130 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
1e140 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
1e150 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
1e160 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  e-lock %d failed
1e170 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
1e180 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
1e190 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25  " - afterwards %
1e1a0 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
1e1b0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1e1c0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53  ->sharedMask, pS
1e1d0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1e1e0 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ));.  }.#endif..
1e1f0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20    return rc;    
1e200 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50      .}.../*.** P
1e210 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d  urge the unixShm
1e220 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
1e230 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
1e240 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  h unixShmNode.nR
1e250 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
1e260 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
1e270 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
1e280 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
1e290 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
1e2a0 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
1e2b0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
1e2c0 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
1e2d0 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67  void unixShmPurg
1e2e0 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
1e2f0 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
1e300 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65  *p = pFd->pInode
1e310 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73  ->pShmNode;.  as
1e320 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
1e330 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  eld() );.  if( p
1e340 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29   && p->nRef==0 )
1e350 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1e360 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f   assert( p->pIno
1e370 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20  de==pFd->pInode 
1e380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
1e390 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
1e3a0 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ex);.    for(i=0
1e3b0 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
1e3c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1e3d0 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  p->h>=0 ){.     
1e3e0 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70 52     munmap(p->apR
1e3f0 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52  egion[i], p->szR
1e400 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65  egion);.      }e
1e410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1e420 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
1e430 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  egion[i]);.     
1e440 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1e450 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
1e460 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20  egion);.    if( 
1e470 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  p->h>=0 ){.     
1e480 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1e490 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  d, p->h, __LINE_
1e4a0 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d  _);.      p->h =
1e4b0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
1e4c0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1e4d0 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  de = 0;.    sqli
1e4e0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
1e4f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1e500 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1e510 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  rea associated w
1e520 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73  ith open databas
1e530 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a  e file pDbFd.  .
1e540 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  ** This particul
1e550 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ar implementatio
1e560 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66  n uses mmapped f
1e570 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
1e580 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70  file used to imp
1e590 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65  lement shared-me
1e5a0 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73  mory is in the s
1e5b0 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ame directory.**
1e5c0 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
1e5d0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68  abase file and h
1e5e0 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
1e5f0 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
1e600 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69  abase.** file wi
1e610 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75  th the "-shm" su
1e620 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72  ffix added.  For
1e630 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1e640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
1e650 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72  * is "/home/user
1e660 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65  1/config.db" the
1e670 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  n the file that 
1e680 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d  is created and m
1e690 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68  mapped.** for sh
1e6a0 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  ared memory will
1e6b0 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d   be called "/hom
1e6c0 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
1e6d0 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  b-shm".  .**.** 
1e6e0 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68  Another approach
1e6f0 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69   to is to use fi
1e700 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20  les in /dev/shm 
1e710 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61  or /dev/tmp or a
1e720 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20  n.** some other 
1e730 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74  tmpfs mount. But
1e740 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20   if a file in a 
1e750 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74  different direct
1e760 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ory.** from the 
1e770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1e780 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66   used, then diff
1e790 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72  ering access per
1e7a0 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61  missions.** or a
1e7b0 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20   chroot() might 
1e7c0 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72  cause two differ
1e7d0 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e  ent processes on
1e7e0 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74   the same.** dat
1e7f0 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20  abase to end up 
1e800 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20  using different 
1e810 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64  files for shared
1e820 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65   memory - .** me
1e830 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72  aning that their
1e840 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f   memory would no
1e850 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72  t really be shar
1e860 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a  ed - resulting.*
1e870 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  * in database co
1e880 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72  rruption.  Never
1e890 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d  theless, this tm
1e8a0 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a  pfs file usage.*
1e8b0 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64  * can be enabled
1e8c0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1e8d0 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
1e8e0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f  SHM_DIRECTORY="/
1e8f0 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74  dev/shm".** or t
1e900 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  he equivalent.  
1e910 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53  The use of the S
1e920 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1e930 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
1e940 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c  .** option resul
1e950 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  ts in an incompa
1e960 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  tible build of S
1e970 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f  QLite;  builds o
1e980 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74  f SQLite.** that
1e990 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20   with differing 
1e9a0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1e9b0 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74  TORY settings at
1e9c0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65  tempt to use the
1e9d0 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73  .** same databas
1e9e0 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
1e9f0 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73  me time, databas
1ea00 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c  e corruption wil
1ea10 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
1ea20 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53  lt. The SQLITE_S
1ea30 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
1ea40 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
1ea50 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a   is considered.*
1ea60 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20  * "unsupported" 
1ea70 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20  and may go away 
1ea80 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69  in a future SQLi
1ea90 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a  te release..**.*
1eaa0 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
1eab0 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
1eac0 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
1ead0 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
1eae0 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
1eaf0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
1eb00 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
1eb10 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
1eb20 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
1eb30 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
1eb40 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
1eb50 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
1eb60 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
1eb70 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leared..**.** If
1eb80 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1eb90 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62  tabase file (pDb
1eba0 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65  Fd) is using the
1ebb0 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53   "unix-excl" VFS
1ebc0 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74  .** that means t
1ebd0 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  hat an exclusive
1ebe0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
1ebf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ec00 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e  le and.** that n
1ec10 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
1ec20 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65  s are able to re
1ec30 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
1ec40 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a  database.  In.**
1ec50 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64   that case, we d
1ec60 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65  o not really nee
1ec70 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  d shared memory.
1ec80 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f    No shared memo
1ec90 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72  ry.** file is cr
1eca0 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72  eated.  The shar
1ecb0 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ed memory will b
1ecc0 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68  e simulated with
1ecd0 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   heap memory..*/
1ece0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1ecf0 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
1ed00 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64  (unixFile *pDbFd
1ed10 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
1ed20 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  Shm *p = 0;     
1ed30 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1ed40 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
1ed50 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
1ed60 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
1ed70 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20  mNode;   /* The 
1ed80 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
1ed90 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
1eda0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1edc0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1edd0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1ede0 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
1edf0 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66   /* The inode of
1ee00 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
1ee10 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
1ee20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1ee30 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65   of the file use
1ee40 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69  d for SHM */.  i
1ee50 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  nt nShmFilename;
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ee70 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48  * Size of the SH
1ee80 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79  M filename in by
1ee90 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  tes */..  /* All
1eea0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1eeb0 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20  the new unixShm 
1eec0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d  object. */.  p =
1eed0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1eee0 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
1eef0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1ef00 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1ef10 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1ef20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61  sizeof(*p));.  a
1ef30 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53  ssert( pDbFd->pS
1ef40 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  hm==0 );..  /* C
1ef50 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1ef60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1ef70 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  ect already exis
1ef80 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69  ts. Reuse an exi
1ef90 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69  sting.  ** one i
1efa0 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74  f present. Creat
1efb0 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
1efc0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
1efd0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
1efe0 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44  );.  pInode = pD
1eff0 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70  bFd->pInode;.  p
1f000 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ShmNode = pInode
1f010 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66  ->pShmNode;.  if
1f020 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
1f030 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1f040 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
1f050 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74          /* fstat
1f060 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61  () info for data
1f070 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
1f080 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28    /* Call fstat(
1f090 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
1f0a0 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
1f0b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f0c0 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20  file. If.    ** 
1f0d0 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65  a new *-shm file
1f0e0 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20   is created, an 
1f0f0 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20  attempt will be 
1f100 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69  made to create i
1f110 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  t.    ** with th
1f120 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
1f130 6e 73 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70  ns. The actual p
1f140 65 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 20 66  ermissions the f
1f150 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 20  ile is created. 
1f160 20 20 20 2a 2a 20 77 69 74 68 20 61 72 65 20 73     ** with are s
1f170 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63 75  ubject to the cu
1f180 72 72 65 6e 74 20 75 6d 61 73 6b 20 73 65 74 74  rrent umask sett
1f190 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1f1a0 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46  if( osFstat(pDbF
1f1b0 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26  d->h, &sStat) &&
1f1c0 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
1f1d0 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
1f1e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1f1f0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20  ERR_FSTAT;.     
1f200 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1f210 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  rr;.    }..#ifde
1f220 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
1f230 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46  ECTORY.    nShmF
1f240 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66  ilename = sizeof
1f250 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
1f260 43 54 4f 52 59 29 20 2b 20 33 30 3b 0a 23 65 6c  CTORY) + 30;.#el
1f270 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  se.    nShmFilen
1f280 61 6d 65 20 3d 20 35 20 2b 20 28 69 6e 74 29 73  ame = 5 + (int)s
1f290 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50 61  trlen(pDbFd->zPa
1f2a0 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
1f2b0 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74  pShmNode = sqlit
1f2c0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
1f2d0 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
1f2e0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  ShmFilename );. 
1f2f0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d     if( pShmNode=
1f300 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1f310 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1f320 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1f330 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
1f340 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64    memset(pShmNod
1f350 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  e, 0, sizeof(*pS
1f360 68 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a 53  hmNode));.    zS
1f370 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68  hmFilename = pSh
1f380 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1f390 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e   = (char*)&pShmN
1f3a0 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53  ode[1];.#ifdef S
1f3b0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1f3c0 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ORY.    sqlite3_
1f3d0 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
1f3e0 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
1f3f0 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
1f400 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1f410 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
1f420 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d  "/sqlite-shm-%x-
1f430 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %x",.           
1f440 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73            (u32)s
1f450 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33  Stat.st_ino, (u3
1f460 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b  2)sStat.st_dev);
1f470 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74  .#else.    sqlit
1f480 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
1f490 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
1f4a0 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
1f4b0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1f4c0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
1f4d0 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a  Suffix3(pDbFd->z
1f4e0 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  Path, zShmFilena
1f4f0 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  me);.#endif.    
1f500 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31  pShmNode->h = -1
1f510 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e  ;.    pDbFd->pIn
1f520 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
1f530 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53  pShmNode;.    pS
1f540 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d  hmNode->pInode =
1f550 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
1f560 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
1f570 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
1f580 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1f590 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
1f5a0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1f5b0 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
1f5c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1f5d0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
1f5e0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1f5f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e    }..    if( pIn
1f600 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
1f610 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  k==0 ){.      co
1f620 6e 73 74 20 63 68 61 72 20 2a 7a 52 4f 3b 0a 20  nst char *zRO;. 
1f630 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61       int openFla
1f640 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
1f650 43 52 45 41 54 3b 0a 20 20 20 20 20 20 7a 52 4f  CREAT;.      zRO
1f660 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1f670 61 72 61 6d 65 74 65 72 28 70 44 62 46 64 2d 3e  arameter(pDbFd->
1f680 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79  zPath, "readonly
1f690 5f 73 68 6d 22 29 3b 0a 20 20 20 20 20 20 69 66  _shm");.      if
1f6a0 28 20 7a 52 4f 20 26 26 20 73 71 6c 69 74 65 33  ( zRO && sqlite3
1f6b0 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 4f 29 20  GetBoolean(zRO) 
1f6c0 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46  ){.        openF
1f6d0 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
1f6e0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1f6f0 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20  e->isReadonly = 
1f700 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1f710 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
1f720 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46  obust_open(zShmF
1f730 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  ilename, openFla
1f740 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f  gs, (sStat.st_mo
1f750 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20  de&0777));.     
1f760 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
1f770 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  <0 ){.        if
1f780 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
1f790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1f7a0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
1f7b0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
1f7c0 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68  KPT, "open", zSh
1f7d0 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
1f7e0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1f7f0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  pen_err;.       
1f800 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20   }.      }.  .  
1f810 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1f820 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
1f830 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
1f840 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
1f850 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20  witch..      ** 
1f860 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
1f870 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1f880 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20  o length. .     
1f890 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
1f8a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1f8b0 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65  if( unixShmSyste
1f8c0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1f8d0 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_WRLCK, UNIX_SH
1f8e0 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
1f8f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f900 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
1f910 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
1f920 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1f930 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
1f940 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1f950 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e  _SHMOPEN, "ftrun
1f960 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e  cate", zShmFilen
1f970 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
1f980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1f990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f9a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f9b0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1f9c0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44  k(pShmNode, F_RD
1f9d0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
1f9e0 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  S, 1);.      }. 
1f9f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
1fa00 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1fa10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1fa20 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f   Make the new co
1fa30 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64  nnection a child
1fa40 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   of the unixShmN
1fa50 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
1fa60 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
1fa70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1fa80 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
1fa90 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
1faa0 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
1fab0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
1fac0 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
1fad0 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d   p;.  unixLeaveM
1fae0 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
1faf0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1fb00 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
1fb10 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
1fb20 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
1fb30 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
1fb40 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  of the unixEnter
1fb50 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
1fb60 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
1fb70 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
1fb80 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29  (struct unixShm)
1fb90 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
1fba0 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
1fbb0 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
1fbc0 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
1fbd0 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
1fbe0 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
1fbf0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1fc00 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
1fc10 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
1fc20 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
1fc30 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
1fc40 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
1fc50 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
1fc60 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
1fc70 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1fc80 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1fc90 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
1fca0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1fcb0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
1fcc0 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
1fcd0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1fce0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1fcf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fd00 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
1fd10 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
1fd20 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
1fd30 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67  r:.  unixShmPurg
1fd40 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20  e(pDbFd);       
1fd50 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
1fd60 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
1fd70 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
1fd80 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1fd90 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1fda0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1fdb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1fdc0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1fdd0 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
1fde0 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
1fdf0 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
1fe00 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1fe10 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1fe20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fe30 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
1fe40 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
1fe50 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
1fe60 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
1fe70 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
1fe80 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
1fe90 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
1fea0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
1feb0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1fec0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1fed0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1fee0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
1fef0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
1ff00 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78  wise, if the bEx
1ff10 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  tend parameter i
1ff20 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
1ff30 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1ff40 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
1ff50 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1ff60 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
1ff70 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
1ff80 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
1ff90 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
1ffa0 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
1ffb0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
1ffc0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1ffd0 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78  rned. If .** bEx
1ffe0 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  tend is non-zero
1fff0 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
20000 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
20010 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
20020 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
20030 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
20040 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
20050 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
20060 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
20070 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
20080 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
20090 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
200a0 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
200b0 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
200c0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
200d0 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
200e0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
200f0 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
20100 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
20110 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
20120 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
20130 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
20140 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
20150 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
20160 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
20170 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  ixShmMap(.  sqli
20180 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
20190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
201a0 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
201b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
201c0 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
201f0 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
20200 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
20210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20220 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
20230 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c  /.  int bExtend,
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
20260 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
20270 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
20280 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
20290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
202a0 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
202b0 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ry */.){.  unixF
202c0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
202d0 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e  ixFile*)fd;.  un
202e0 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78  ixShm *p;.  unix
202f0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
20300 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
20310 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
20320 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
20330 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  ory file has not
20340 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
20350 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a  , open it now. *
20360 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70  /.  if( pDbFd->p
20370 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Shm==0 ){.    rc
20380 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65   = unixOpenShare
20390 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
203a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
203b0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
203c0 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44  c;.  }..  p = pD
203d0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68  bFd->pShm;.  pSh
203e0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
203f0 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ode;.  sqlite3_m
20400 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
20410 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  ode->mutex);.  a
20420 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d  ssert( szRegion=
20430 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67  =pShmNode->szReg
20440 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ion || pShmNode-
20450 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20  >nRegion==0 );. 
20460 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
20470 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
20480 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
20490 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
204a0 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  h>=0 || pDbFd->p
204b0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
204c0 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
204d0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  rt( pShmNode->h<
204e0 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
204f0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
20500 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
20510 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
20520 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
20530 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20  char **apNew;   
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69     /* New apRegi
20560 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
20570 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
20580 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69  Region+1)*szRegi
20590 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  on;  /* Minimum 
205a0 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
205b0 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
205c0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
205e0 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20  Used by fstat() 
205f0 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
20600 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
20610 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20  egion;..    if( 
20620 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
20630 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
20640 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
20650 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
20660 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
20670 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
20680 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  .      ** Check 
20690 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
206a0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
206b0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
206c0 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
206d0 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e       ** large en
206e0 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
206f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
20700 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  gion)..      */.
20710 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
20720 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26  t(pShmNode->h, &
20730 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
20740 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
20750 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20  ERR_SHMSIZE;.   
20760 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
20770 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
20780 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61   .      if( sSta
20790 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20  t.st_size<nByte 
207a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
207b0 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
207c0 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
207d0 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78  ot exist. If bEx
207e0 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20  tend is set to. 
207f0 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c         ** false,
20800 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
20810 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
20820 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
20830 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
20840 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
20850 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  ** Alternatively
20860 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20  , if bExtend is 
20870 74 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63  true, use ftrunc
20880 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74  ate() to allocat
20890 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
208a0 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
208b0 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20  y region..      
208c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
208d0 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f   !bExtend ) goto
208e0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
208f0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
20900 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
20910 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ode->h, nByte) )
20920 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
20930 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
20940 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
20950 5a 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  ZE, "ftruncate",
20960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68               pSh
20980 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
20990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
209a0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
209b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
209c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
209d0 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
209e0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
209f0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
20a00 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
20a10 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
20a20 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
20a30 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
20a40 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
20a50 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
20a60 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a  1)*sizeof(char *
20a70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
20a80 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
20a90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
20aa0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
20ab0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
20ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
20ad0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d  Node->apRegion =
20ae0 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c   apNew;.    whil
20af0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  e(pShmNode->nReg
20b00 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20  ion<=iRegion){. 
20b10 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b       void *pMem;
20b20 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
20b30 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
20b40 20 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70       pMem = mmap
20b50 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20  (0, szRegion,.  
20b60 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
20b70 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f  de->isReadonly ?
20b80 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f   PROT_READ : PRO
20b90 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54  T_READ|PROT_WRIT
20ba0 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
20bb0 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d  MAP_SHARED, pShm
20bc0 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64  Node->h, pShmNod
20bd0 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67  e->nRegion*szReg
20be0 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
20bf0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
20c00 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
20c10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
20c20 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
20c30 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
20c40 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
20c50 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
20c60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
20c70 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
20c80 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
20c90 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
20ca0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
20cb0 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
20cc0 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b    if( pMem==0 ){
20cd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20ce0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
20cf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
20d00 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
20d10 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73    }.        mems
20d20 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65  et(pMem, 0, szRe
20d30 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gion);.      }. 
20d40 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
20d50 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  pRegion[pShmNode
20d60 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65  ->nRegion] = pMe
20d70 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  m;.      pShmNod
20d80 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
20d90 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
20da0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
20db0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
20dc0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70  egion ){.    *pp
20dd0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52   = pShmNode->apR
20de0 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a  egion[iRegion];.
20df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
20e00 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
20e10 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
20e20 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49  only && rc==SQLI
20e30 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
20e40 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
20e50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
20e60 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
20e70 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
20e80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
20e90 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
20ea0 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
20eb0 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
20ec0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
20ed0 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
20ee0 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61  between SHAREd a
20ef0 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  nd EXCLUSIVE loc
20f00 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a  ks is a little.*
20f10 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65  * different here
20f20 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20   than in posix. 
20f30 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20   In xShmLock(), 
20f40 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20  one can go from 
20f50 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73  unlocked.** to s
20f60 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f  hared and back o
20f70 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  r from unlocked 
20f80 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64  to exclusive and
20f90 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20   back.  But one 
20fa0 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72  may.** not go fr
20fb0 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63  om shared to exc
20fc0 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65  lusive or from e
20fd0 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72  xclusive to shar
20fe0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20ff0 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20  t unixShmLock(. 
21000 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
21010 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
21020 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
21030 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
21040 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
21050 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
21060 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
21070 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
21080 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
21090 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
210a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
210b0 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
210c0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
210d0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
210e0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
210f0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
21100 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
21110 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
21120 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
21130 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a  ile*)fd;      /*
21140 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
21150 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
21160 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  y */.  unixShm *
21170 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21190 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
211a0 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
211b0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
211e0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
211f0 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
21200 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
21210 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
21220 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64  ode;  /* The und
21230 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f  erlying file iNo
21240 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
21250 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21270 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
21280 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
212b0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
212c0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
212d0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
212e0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
212f0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
21300 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
21310 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
21320 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
21330 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
21340 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
21350 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
21360 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
21370 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
21380 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
21390 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
213a0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
213b0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
213c0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
213d0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
213e0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
213f0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
21400 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
21410 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
21420 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
21430 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
21440 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
21450 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
21460 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
21470 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
21480 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20  CLUSIVE)!=0 );. 
21490 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
214a0 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
214b0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
214c0 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
214d0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
214e0 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
214f0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
21500 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  ock==0 );..  mas
21510 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
21520 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
21530 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
21540 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
21550 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
21560 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
21570 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
21580 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
21590 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
215a0 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
215b0 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
215c0 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
215d0 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
215e0 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
215f0 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
21600 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
21610 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
21620 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
21630 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
21640 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
21650 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
21660 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
21670 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
21680 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
21690 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
216a0 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
216b0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
216c0 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
216d0 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
216e0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
216f0 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
21700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
21710 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
21720 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
21730 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  UNLCK, ofst+UNIX
21740 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
21750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21770 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
21780 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
21790 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
217a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
217b0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
217c0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
217d0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
217e0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
217f0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
21800 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
21810 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
21820 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
21830 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
21840 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
21850 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
21860 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
21870 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
21880 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
21890 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
218a0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
218b0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
218c0 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
218d0 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
218e0 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
218f0 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
21900 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
21910 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
21920 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
21930 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
21940 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
21950 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
21960 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
21970 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
21980 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
21990 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
219a0 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72   }.      allShar
219b0 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
219c0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
219d0 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c   /* Get shared l
219e0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
219f0 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63  em level, if nec
21a00 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
21a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21a20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c  ){.      if( (al
21a30 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d  lShared & mask)=
21a40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
21a50 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
21a60 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
21a70 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _RDLCK, ofst+UNI
21a80 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
21a90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21aa0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21ab0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
21ac0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
21ad0 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
21ae0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
21af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21b00 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
21b10 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
21b20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
21b30 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
21b40 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
21b50 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
21b60 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
21b70 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
21b80 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
21b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
21ba0 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
21bb0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
21bc0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
21bd0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
21be0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
21bf0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
21c00 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
21c10 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
21c20 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
21c30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
21c40 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
21c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21c60 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
21c70 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
21c80 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
21c90 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
21ca0 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
21cb0 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
21cc0 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
21cd0 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
21ce0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21cf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21d00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
21d10 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
21d20 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
21d30 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
21d40 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
21d50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21d60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
21d70 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
21d80 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
21d90 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
21da0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
21db0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21dc0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
21dd0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
21de0 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
21df0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
21e00 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
21e10 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
21e20 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
21e30 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e  d, getpid(), p->
21e40 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
21e50 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74  xclMask));.  ret
21e60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21e70 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
21e80 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
21e90 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
21ea0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
21eb0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
21ec0 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
21ed0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
21ee0 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
21ef0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
21f00 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
21f10 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
21f20 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
21f30 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72   void unixShmBar
21f40 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
21f50 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
21f60 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
21f70 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
21f80 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
21f90 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
21fa0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
21fb0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
21fc0 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  x();.  unixLeave
21fd0 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
21fe0 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
21ff0 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
22000 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
22010 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
22020 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
22030 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
22040 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
22050 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d  is no shared mem
22060 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
22070 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ith the connecti
22080 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  on then this.** 
22090 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
220a0 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
220b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
220c0 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
220d0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
220e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
220f0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
22100 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
22110 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
22140 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
22150 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
22160 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
22170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22180 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
22190 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
221a0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
221b0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
221c0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
221d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
221e0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
221f0 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
22200 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
22210 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
22220 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
22230 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
22240 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
22250 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
22260 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
22270 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  le */..  pDbFd =
22280 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
22290 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
222a0 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
222b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
222c0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
222d0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61  ->pShmNode;..  a
222e0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
222f0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
22300 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
22310 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
22320 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
22330 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52  Inode );..  /* R
22340 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
22350 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
22360 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
22370 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
22380 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
22390 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
223a0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
223b0 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
223c0 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
223d0 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
223e0 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
223f0 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
22400 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
22410 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
22420 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
22430 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
22440 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
22450 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
22460 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
22470 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
22480 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
22490 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
224a0 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
224b0 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
224c0 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
224d0 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
224e0 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
224f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
22500 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
22510 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
22520 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
22530 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c  0 ){.    if( del
22540 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e  eteFlag && pShmN
22550 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73 55 6e  ode->h>=0 ) osUn
22560 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  link(pShmNode->z
22570 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75  Filename);.    u
22580 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46  nixShmPurge(pDbF
22590 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
225a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
225b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
225c0 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}...#else.# def
225d0 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  ine unixShmMap  
225e0 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
225f0 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  ixShmLock    0.#
22600 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42   define unixShmB
22610 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
22620 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20  e unixShmUnmap  
22630 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
22640 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22650 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48  _WAL */../*.** H
22660 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
22670 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
22680 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
22690 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
226a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
226b0 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
226c0 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
226d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
226e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
226f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
22740 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
22750 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
22760 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
22770 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
22780 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
22790 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
227a0 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
227b0 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
227c0 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
227d0 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
227e0 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
227f0 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
22800 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
22810 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
22820 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
22830 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
22840 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
22850 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
22860 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
22870 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
22880 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
22890 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
228a0 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
228b0 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
228c0 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
228d0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
228e0 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
228f0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
22900 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
22910 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
22920 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
22930 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
22940 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
22950 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
22960 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
22970 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
22980 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
22990 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
229a0 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
229b0 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
229c0 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
229d0 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
229e0 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e  r finder-funtion
229f0 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20   F, two objects 
22a00 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a  are created:.**.
22a10 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65  **    (1) The re
22a20 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  al finder-functi
22a30 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28  on named "FImpt(
22a40 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  )"..**.**    (2)
22a50 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e   A constant poin
22a60 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ter to this func
22a70 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20  tion named just 
22a80 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20  "F"..**.**.** A 
22a90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
22aa0 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64   pointer is used
22ab0 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61   as the pAppData
22ac0 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a   value for VFS.*
22ad0 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68  * objects.  We h
22ae0 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69  ave to do this i
22af0 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
22b00 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74  g pAppData point
22b10 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20  .** directly at 
22b20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  the finder-funct
22b30 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75  ion since C90 ru
22b40 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f  les prevent a vo
22b50 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63  id*.** from be c
22b60 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74  ast into a funct
22b70 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ion pointer..**.
22b80 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61  **.** Each insta
22b90 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72  nce of this macr
22ba0 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  o generates two 
22bb0 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  objects:.**.**  
22bc0 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73   *  A constant s
22bd0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
22be0 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45  s object call ME
22bf0 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f  THOD that has lo
22c00 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
22c10 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43  thods CLOSE, LOC
22c20 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53  K, UNLOCK, CKRES
22c30 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  LOCK..**.**   * 
22c40 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66   An I/O method f
22c50 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63  inder function c
22c60 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61  alled FINDER tha
22c70 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  t returns a poin
22c80 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ter.**      to t
22c90 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74  he METHOD object
22ca0 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
22cb0 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66   bullet..*/.#def
22cc0 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49  ine IOMETHODS(FI
22cd0 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45  NDER, METHOD, VE
22ce0 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f  RSION, CLOSE, LO
22cf0 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f  CK, UNLOCK, CKLO
22d00 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69  CK)      \.stati
22d10 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
22d20 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f  io_methods METHO
22d30 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20  D = {           
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52          \.   VER
22d60 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20  SION,           
22d70 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
22d80 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22da0 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53         \.   CLOS
22db0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
22dc0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
22dd0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52        \.   unixR
22e00 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
22e10 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
22e20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e40 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72       \.   unixWr
22e50 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
22e60 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
22e70 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75      \.   unixTru
22ea0 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
22eb0 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
22ec0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63     \.   unixSync
22ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22f00 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20      /* xSync */ 
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53    \.   unixFileS
22f40 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
22f50 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
22f60 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20   \.   LOCK,     
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20    /* xLock */   
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20  \.   UNLOCK,    
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ff0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20   /* xUnlock */  
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23020 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20  .   CKLOCK,     
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23040 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
23050 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  dLock */        
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23070 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72     unixFileContr
23080 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
23090 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
230a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
230c0 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
230d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
230e0 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20   xSectorSize */ 
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23100 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
23110 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
23120 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20  cteristics,  /* 
23130 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74  xDeviceCapabilit
23140 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ies */          
23150 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23160 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20  unixShmMap,     
23170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23180 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20  ShmMap */       
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
231b0 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  nixShmLock,     
231c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
231d0 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  hmLock */       
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
23200 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  ixShmBarrier,   
23210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
23220 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20  mBarrier */     
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23240 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
23250 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20  xShmUnmap       
23260 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
23270 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  Unmap */        
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23290 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20         \.};     
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232e0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
232f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
23300 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23  methods *FINDER#
23310 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72  #Impl(const char
23320 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70   *z, unixFile *p
23330 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f  ){   \.  UNUSED_
23340 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
23350 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
23360 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
23370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23380 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
23390 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233d0 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20     \.}          
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23420 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
23430 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23440 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e  ods *(*const FIN
23450 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  DER)(const char*
23460 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20  ,unixFile *p)   
23470 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23   \.    = FINDER#
23480 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  #Impl;../*.** He
23490 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
234a0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
234b0 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
234c0 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
234d0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
234e0 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
234f0 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
23500 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
23510 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
23520 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
23530 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
23540 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
23550 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
23560 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
23570 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
23580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
23590 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
235a0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
235b0 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
235c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
235d0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
235e0 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  enabled */.  uni
235f0 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
23600 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
23610 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
23620 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
23630 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
23640 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
23650 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
23660 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
23670 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
23680 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23690 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck     /* xCheck
236a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
236b0 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
236c0 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  DS(.  nolockIoFi
236d0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
236e0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
236f0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  on name */.  nol
23700 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
23710 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23720 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
23730 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23750 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
23760 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
23770 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  bled */.  nolock
23780 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
23790 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
237a0 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
237b0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
237c0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
237d0 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55  hod */.  nolockU
237e0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
237f0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
23800 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
23810 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23820 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  k   /* xCheckRes
23830 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
23840 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
23850 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
23860 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
23870 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
23880 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
23890 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
238a0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
238b0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
238c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
238f0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
23900 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  d */.  dotlockCl
23910 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
23920 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
23930 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
23940 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23950 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
23960 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
23970 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23980 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
23990 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
239a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
239b0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
239c0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
239d0 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .)..#if SQLITE_E
239e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
239f0 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
23a00 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
23a10 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  flockIoFinder,  
23a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
23a30 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
23a40 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65  e */.  flockIoMe
23a50 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
23a60 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
23a70 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
23a80 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23aa0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
23ab0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
23ac0 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20  /.  flockClose, 
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23ae0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
23af0 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  /.  flockLock,  
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23b10 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
23b20 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  .  flockUnlock, 
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b40 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
23b50 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  /.  flockCheckRe
23b60 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
23b70 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
23b80 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
23b90 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
23ba0 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
23bb0 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23bd0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
23be0 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
23bf0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
23c00 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
23c10 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
23c20 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
23c50 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
23c60 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65  ed */.  semClose
23c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23c80 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
23c90 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c  od */.  semLock,
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cb0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
23cc0 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b  d */.  semUnlock
23cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23ce0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
23cf0 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b  od */.  semCheck
23d00 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
23d10 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
23d20 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
23d30 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
23d40 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
23d50 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
23d60 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
23d70 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
23d80 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
23d90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
23da0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
23db0 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
23dc0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
23dd0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
23de0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
23df0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e10 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
23e20 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
23e30 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e50 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
23e60 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e80 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
23e90 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23eb0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
23ec0 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
23ed0 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
23ee0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23ef0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
23f00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
23f10 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
23f20 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
23f30 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
23f40 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
23f50 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
23f60 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
23f70 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
23f80 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
23f90 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
23fa0 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
23fb0 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
23fc0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
23fd0 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
23fe0 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
23ff0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
24000 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
24010 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
24020 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
24030 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
24040 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
24050 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
24060 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
24070 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
24080 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
24090 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
240a0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
240b0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
240c0 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
240d0 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
240e0 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
240f0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
24100 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
24110 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24120 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
24130 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
24140 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
24150 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
24160 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
24170 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
24180 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
24190 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
241a0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
241b0 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
241c0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
241d0 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
241e0 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
241f0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
24200 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
24210 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
24220 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
24230 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
24240 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
24250 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
24260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24270 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
24280 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
24290 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
242a0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
242b0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
242c0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
242d0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
242e0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
242f0 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
24300 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
24310 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
24320 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
24330 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
24340 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
24350 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
24360 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
24370 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f  * nfs lockd on O
24380 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74  SX 10.3+ doesn't
24390 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63   clear write loc
243a0 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  ks when a read l
243b0 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69  ock is set */.#i
243c0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
243d0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
243e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
243f0 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
24400 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20   nfsIoFinder,   
24410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24420 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
24430 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65  ame */.  nfsIoMe
24440 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
24450 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
24460 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
24470 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
244a0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
244b0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
244c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
244d0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
244e0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
244f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
24500 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
24510 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f  hod */.  nfsUnlo
24520 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
24530 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
24540 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
24550 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
24560 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
24570 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
24580 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
24590 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
245a0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
245b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
245c0 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
245d0 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
245e0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
245f0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
24600 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
24610 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
24620 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
24630 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
24640 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
24650 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
24660 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
24670 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
24680 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
24690 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63   This is for Mac
246a0 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  OSX only..*/.sta
246b0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
246c0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
246d0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
246e0 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
246f0 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
24700 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
24710 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
24720 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
24730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65            /* ope
24740 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f  n file object fo
24750 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
24760 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ile */.){.  stat
24770 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
24780 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f  Mapping {.    co
24790 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73  nst char *zFiles
247a0 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20  ystem;          
247b0 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65      /* Filesyste
247c0 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20  m type name */. 
247d0 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
247e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
247f0 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72  thods;   /* Appr
24800 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
24810 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d  method */.  } aM
24820 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ap[] = {.    { "
24830 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  hfs",    &posixI
24840 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
24850 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73  { "ufs",    &pos
24860 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
24870 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26     { "afpfs",  &
24880 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
24890 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
248a0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
248b0 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
248c0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
248d0 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
248e0 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
248f0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
24900 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
24910 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
24920 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
24930 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
24940 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
24950 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
24960 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
24970 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
24980 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
24990 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
249a0 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
249b0 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
249c0 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hods;.  }.  if( 
249d0 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
249e0 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
249f0 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
24a00 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
24a10 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
24a20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
24a30 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
24a40 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
24a50 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
24a60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
24a70 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
24a80 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
24a90 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
24aa0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24ab0 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70  return aMap[i].p
24ac0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d  Methods;.      }
24ad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
24ae0 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48   Default case. H
24af0 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20  andles, amongst 
24b00 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20  others, "nfs".. 
24b10 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61   ** Test byte-ra
24b20 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66  nge lock using f
24b30 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63  cntl(). If the c
24b40 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20  all succeeds, . 
24b50 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
24b60 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
24b70 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73  supports POSIX s
24b80 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a  tyle locks. .  *
24b90 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
24ba0 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
24bb0 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
24bc0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
24bd0 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
24be0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
24bf0 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
24c00 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
24c10 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
24c20 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
24c30 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
24c40 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
24c50 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b  me, "nfs")==0 ){
24c60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
24c70 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  fsIoMethods;.   
24c80 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
24c90 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
24ca0 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
24cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
24cc0 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  n &dotlockIoMeth
24cd0 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
24ce0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
24cf0 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
24d00 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
24d10 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
24d20 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
24d30 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
24d40 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
24d50 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
24d60 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
24d70 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
24d80 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f  TYLE */..#if OS_
24d90 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54  VXWORKS && SQLIT
24da0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
24db0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
24dc0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
24dd0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
24de0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
24df0 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
24e00 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
24e10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
24e20 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
24e30 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
24e40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
24e50 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
24e60 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
24e70 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
24e80 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56 58  * This is for VX
24e90 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  Works only..*/.s
24ea0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
24eb0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
24ec0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
24ed0 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
24ee0 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
24ef0 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
24f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24f10 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
24f20 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
24f30 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
24f40 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
24f50 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
24f60 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
24f70 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
24f80 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
24f90 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
24fa0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
24fb0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
24fc0 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
24fd0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
24fe0 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
24ff0 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
25000 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
25010 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
25020 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
25030 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
25040 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
25050 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
25060 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
25070 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
25080 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
25090 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
250a0 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
250b0 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
250c0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
250d0 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
250e0 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
250f0 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
25100 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
25110 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
25120 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
25130 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
25140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
25150 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
25160 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
25170 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
25180 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
25190 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
251a0 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
251b0 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
251c0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
251d0 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
251e0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  * OS_VXWORKS && 
251f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
25200 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
25210 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
25220 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
25230 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74  nter to a IO met
25240 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
25250 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
25260 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
25270 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
25280 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
25290 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
252a0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
252b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
252c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
252d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
252e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
252f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
25300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
25310 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
25320 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
25330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
25340 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
25350 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
25360 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
25370 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
25380 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
25390 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
253a0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
253b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
253c0 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
253d0 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
253e0 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
253f0 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
25400 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
25410 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
25420 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
25430 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
25440 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
25450 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
25460 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
25470 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
25480 64 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44  d */.  int syncD
25490 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ir,            /
254a0 2a 20 54 72 75 65 20 74 6f 20 73 79 6e 63 20 64  * True to sync d
254b0 69 72 65 63 74 6f 72 79 20 6f 6e 20 66 69 72 73  irectory on firs
254c0 74 20 73 79 6e 63 20 2a 2f 0a 20 20 73 71 6c 69  t sync */.  sqli
254d0 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20  te3_file *pId,  
254e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
254f0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
25500 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
25510 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
25520 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
25530 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
25540 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
25550 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20  nt noLock,      
25560 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c         /* Omit l
25570 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65 20 2a  ocking if true *
25580 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  /.  int isDelete
25590 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
255a0 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69  elete on close i
255b0 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
255c0 69 73 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20  isReadOnly      
255d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
255e0 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  he file is opene
255f0 64 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 29  d read-only */.)
25600 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
25610 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c  3_io_methods *pL
25620 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
25630 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
25640 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
25650 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25660 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
25670 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d  ( pNew->pInode==
25680 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61  NULL );..  /* Pa
25690 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74 65  rameter isDelete
256a0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e   is only used on
256b0 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72 65 73   vxworks. Expres
256c0 73 20 74 68 69 73 20 65 78 70 6c 69 63 69 74 6c  s this explicitl
256d0 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f 20  y .  ** here to 
256e0 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72  prevent compiler
256f0 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20   warnings about 
25700 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  unused parameter
25710 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  s..  */.  UNUSED
25720 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65 6c  _PARAMETER(isDel
25730 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61  ete);..  /* Usua
25740 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69  lly the path zFi
25750 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f  lename should no
25760 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20  t be a relative 
25770 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20  pathname. The.  
25780 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  ** exception is 
25790 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
257a0 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66   proxy "conch" f
257b0 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68  ile in builds th
257c0 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20  at.  ** include 
257d0 74 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c  the special Appl
257e0 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73  e locking styles
257f0 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
25800 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
25810 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
25820 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61  OCKING_STYLE.  a
25830 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
25840 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
25850 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c  [0]=='/' .    ||
25860 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d   pVfs->pAppData=
25870 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63  =(void*)&autoloc
25880 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c  kIoFinder );.#el
25890 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  se.  assert( zFi
258a0 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
258b0 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29  lename[0]=='/' )
258c0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e  ;.#endif..  /* N
258d0 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73  o locking occurs
258e0 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69   in temporary fi
258f0 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
25900 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c   zFilename!=0 ||
25910 20 6e 6f 4c 6f 63 6b 20 29 3b 0a 0a 20 20 4f 53   noLock );..  OS
25920 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
25930 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
25940 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
25950 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
25960 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
25970 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65 6d 63  name;.  if( memc
25980 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22  mp(pVfs->zName,"
25990 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d  unix-excl",10)==
259a0 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
259b0 74 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49 58 46  trlFlags = UNIXF
259c0 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c 73  ILE_EXCL;.  }els
259d0 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  e{.    pNew->ctr
259e0 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a  lFlags = 0;.  }.
259f0 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c 79    if( isReadOnly
25a00 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
25a10 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
25a20 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  ILE_RDONLY;.  }.
25a30 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 7b    if( syncDir ){
25a40 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
25a50 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
25a60 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 0a 23  _DIRSYNC;.  }..#
25a70 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
25a80 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
25a90 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
25aa0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
25ab0 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
25ac0 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a      noLock = 1;.
25ad0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25ae0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
25af0 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  f..  if( noLock 
25b00 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
25b10 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
25b20 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
25b30 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
25b40 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
25b50 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
25b60 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
25b70 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
25b80 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25b90 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
25ba0 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
25bb0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
25bc0 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
25bd0 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
25be0 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
25bf0 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
25c00 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
25c10 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
25c20 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
25c30 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
25c40 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
25c50 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
25c60 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
25c70 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
25c80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
25c90 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
25ca0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
25cb0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
25cc0 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
25cd0 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
25ce0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
25cf0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25d00 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
25d10 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
25d20 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
25d30 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
25d40 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
25d50 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
25d60 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
25d70 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
25d80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25d90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
25da0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25db0 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64  ured in findInod
25dc0 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74  eInfo(), close t
25dd0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
25de0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65  or.      ** imme
25df0 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20  diately, before 
25e00 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75  releasing the mu
25e10 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  tex. findInodeIn
25e20 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
25e30 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
25e40 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
25e50 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
25e60 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
25e70 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
25e80 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
25e90 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
25ea0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
25eb0 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
25ec0 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
25ed0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
25ee0 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
25ef0 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
25f00 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
25f10 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
25f20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
25f30 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
25f40 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
25f50 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
25f60 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
25f70 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
25f80 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49     ** findInodeI
25f90 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
25fa0 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
25fb0 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
25fc0 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
25fd0 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
25fe0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
25ff0 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
26000 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
26010 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
26020 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
26030 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
26040 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
26050 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
26060 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
26070 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
26080 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
26090 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
260a0 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
260b0 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
260c0 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
260d0 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
260e0 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
260f0 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
26100 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
26110 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
26120 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
26130 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
26140 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
26150 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
26160 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
26170 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
26180 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
26190 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
261a0 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
261b0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
261c0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
261d0 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
261e0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
261f0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
26200 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
26210 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
26220 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
26230 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
26240 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
26250 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
26260 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
26270 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
26280 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
26290 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
262a0 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
262b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
262c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
262d0 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
262e0 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
262f0 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
26300 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
26310 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
26320 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
26330 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
26340 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
26350 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
26360 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
26370 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
26380 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
26390 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
263a0 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  me;.      pCtx->
263b0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
263c0 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
263d0 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
263e0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
263f0 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
26400 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
26410 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  pInode);.      i
26420 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26430 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26440 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
26450 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
26460 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
26470 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
26480 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
26490 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d   h = -1;.      }
264a0 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65  .      unixLeave
264b0 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
264c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
264d0 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  f..  else if( pL
264e0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
264f0 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
26500 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69   ){.    /* Dotfi
26510 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  le locking uses 
26520 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
26530 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
26540 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
26550 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** the dotlockLo
26560 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20  ckingContext .  
26570 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
26580 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e  LockFile;.    in
26590 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  t nFilename;.   
265a0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
265b0 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69  me!=0 );.    nFi
265c0 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74  lename = (int)st
265d0 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20  rlen(zFilename) 
265e0 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69  + 6;.    zLockFi
265f0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  le = (char *)sql
26600 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c  ite3_malloc(nFil
26610 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
26620 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
26630 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26640 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
26650 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
26660 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
26670 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c  name, zLockFile,
26680 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55   "%s" DOTLOCK_SU
26690 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  FFIX, zFilename)
266a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
266b0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
266c0 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20   = zLockFile;.  
266d0 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
266e0 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  S.  else if( pLo
266f0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73  ckingStyle == &s
26700 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  emIoMethods ){. 
26710 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61     /* Named sema
26720 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73  phore locking us
26730 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
26740 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
26750 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64  be.    ** includ
26760 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63  ed in the semLoc
26770 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20  kingContext.    
26780 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  */.    unixEnter
26790 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
267a0 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
267b0 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
267c0 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ode);.    if( (r
267d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
267e0 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e   (pNew->pInode->
267f0 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20  pSem==NULL) ){. 
26800 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e       char *zSemN
26810 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f  ame = pNew->pIno
26820 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20  de->aSemName;.  
26830 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
26840 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
26850 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
26860 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73  zSemName, "/%s.s
26870 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  em",.           
26880 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
26890 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
268a0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  lName);.      fo
268b0 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65  r( n=1; zSemName
268c0 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20  [n]; n++ ).     
268d0 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b     if( zSemName[
268e0 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61  n]=='/' ) zSemNa
268f0 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20  me[n] = '_';.   
26900 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
26910 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e  >pSem = sem_open
26920 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45  (zSemName, O_CRE
26930 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20  AT, 0666, 1);.  
26940 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49      if( pNew->pI
26950 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45  node->pSem == SE
26960 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  M_FAILED ){.    
26970 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26980 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
26990 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
269a0 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b  mName[0] = '\0';
269b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
269c0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
269d0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  x();.  }.#endif.
269e0 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45    .  pNew->lastE
269f0 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53  rrno = 0;.#if OS
26a00 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
26a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26a20 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
26a30 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
26a40 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
26a50 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
26a60 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61  osUnlink(zFilena
26a70 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74  me);.    isDelet
26a80 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  e = 0;.  }.  pNe
26a90 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69 73  w->isDelete = is
26aa0 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20  Delete;.#endif. 
26ab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26ac0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
26ad0 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
26ae0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
26af0 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E__);.  }else{. 
26b00 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
26b10 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   = pLockingStyle
26b20 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
26b30 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r(+1);.  }.  ret
26b40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26b50 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
26b60 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20   of a directory 
26b70 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20  in which to put 
26b80 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
26b90 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
26ba0 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  le temporary fil
26bb0 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20  e directory can 
26bc0 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
26bd0 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
26be0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69   const char *uni
26bf0 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69  xTempFileDir(voi
26c00 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
26c10 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
26c20 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
26c30 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
26c40 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
26c50 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
26c60 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20  mp",.     0     
26c70 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69     /* List termi
26c80 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20  nator */.  };.  
26c90 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
26ca0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
26cb0 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
26cc0 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a  *zDir = 0;..  az
26cd0 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Dirs[0] = sqlite
26ce0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
26cf0 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b  ;.  if( !azDirs[
26d00 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d  1] ) azDirs[1] =
26d10 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
26d20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
26d30 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
26d40 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
26d50 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b  ; zDir=azDirs[i+
26d60 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69  +]){.    if( zDi
26d70 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r==0 ) continue;
26d80 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28  .    if( osStat(
26d90 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f  zDir, &buf) ) co
26da0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
26db0 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
26dc0 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  mode) ) continue
26dd0 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65  ;.    if( osAcce
26de0 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63  ss(zDir, 07) ) c
26df0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65  ontinue;.    bre
26e00 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
26e10 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zDir;.}../*.** 
26e20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
26e30 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
26e40 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
26e50 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a   be allocated.**
26e60 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
26e70 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74  process and must
26e80 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
26e90 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a  o hold at least.
26ea0 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ** pVfs->mxPathn
26eb0 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  ame bytes..*/.st
26ec0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
26ed0 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
26ee0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
26ef0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
26f00 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
26f10 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
26f20 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
26f30 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
26f40 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
26f50 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
26f60 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e  123456789";.  un
26f70 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b  signed int i, j;
26f80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26f90 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  Dir;..  /* It's 
26fa0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
26fb0 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
26fc0 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
26fd0 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
26fe0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
26ff0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
27000 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
27010 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
27020 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
27030 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
27040 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
27050 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
27060 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72  IOERR );..  zDir
27070 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
27080 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72  ir();.  if( zDir
27090 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22  ==0 ) zDir = "."
270a0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
270b0 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
270c0 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
270d0 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
270e0 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
270f0 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
27100 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
27110 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
27120 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44    if( (strlen(zD
27130 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c  ir) + strlen(SQL
27140 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
27150 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 28  EFIX) + 17) >= (
27160 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20  size_t)nBuf ){. 
27170 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27180 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64  _ERROR;.  }..  d
27190 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
271a0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c  nprintf(nBuf-17,
271b0 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49   zBuf, "%s/"SQLI
271c0 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
271d0 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
271e0 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  j = (int)strlen(
271f0 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  zBuf);.    sqlit
27200 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
27210 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
27220 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
27230 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
27240 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
27250 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
27260 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
27270 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
27280 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
27290 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
272a0 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73   }while( osAcces
272b0 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
272c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
272d0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
272e0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
272f0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
27300 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
27310 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
27320 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
27330 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
27340 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
27350 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
27360 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
27370 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
27380 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
27390 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
273a0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
273b0 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
273c0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
273d0 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
273e0 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
273f0 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
27400 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
27410 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   Search for an u
27420 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
27430 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f  iptor that was o
27440 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  pened on the dat
27450 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28  abase .** file (
27460 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72  not a journal or
27470 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
27480 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64  file) identified
27490 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20   by pathname.** 
274a0 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54  zPath with SQLIT
274b0 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
274c0 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20   matching those 
274d0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
274e0 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
274f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
27500 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20  n..**.** Such a 
27510 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
27520 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64  may exist if a d
27530 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
27540 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a  on was closed.**
27550 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61   but the associa
27560 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ted file descrip
27570 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tor could not be
27580 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20   closed because 
27590 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69  some.** other fi
275a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
275b0 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
275c0 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ile is holding a
275d0 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52   file-lock..** R
275e0 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73  efer to comments
275f0 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73   in the unixClos
27600 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  e() function and
27610 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d   the lengthy com
27620 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69  ment.** describi
27630 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f  ng "Posix Adviso
27640 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74  ry Locking" at t
27650 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
27660 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75   file for .** fu
27670 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41  rther details. A
27680 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31  lso, ticket #401
27690 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75  8..**.** If a su
276a0 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  itable file desc
276b0 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c  riptor is found,
276c0 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
276d0 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73  rned. If no.** s
276e0 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
276f0 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  tor is located, 
27700 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
27710 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e  */.static UnixUn
27720 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73  usedFd *findReus
27730 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61  ableFd(const cha
27740 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
27750 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73  ags){.  UnixUnus
27760 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
27770 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  0;..  /* Do not 
27780 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  search for an un
27790 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
277a0 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  ptor on vxworks.
277b0 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a   Not because.  *
277c0 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20  * vxworks would 
277d0 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  not benefit from
277e0 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20   the change (it 
277f0 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74  might, we're not
27800 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74   sure),.  ** but
27810 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20   because no way 
27820 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75  to test it is cu
27830 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
27840 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20  e. It is better 
27850 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73  .  ** not to ris
27860 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72  k breaking vxwor
27870 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  ks support for t
27880 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20  he sake of such 
27890 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a  an obscure .  **
278a0 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69   feature.  */.#i
278b0 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
278c0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
278d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
278e0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
278f0 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a  of stat() call *
27900 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  /..  /* A stat()
27910 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
27920 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
27930 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
27940 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
27950 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
27960 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
27970 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
27980 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
27990 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
279a0 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
279b0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
279c0 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
279d0 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
279e0 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
279f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
27a00 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
27a10 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
27a20 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
27a30 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
27a40 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
27a50 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
27a60 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
27a70 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
27a80 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
27a90 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
27aa0 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
27ab0 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
27ac0 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
27ad0 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20   resusable file 
27ae0 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e  descriptor are n
27af0 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69  ot dire.  */.  i
27b00 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  f( 0==osStat(zPa
27b10 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  th, &sStat) ){. 
27b20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f     unixInodeInfo
27b30 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75   *pInode;..    u
27b40 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
27b50 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  .    pInode = in
27b60 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  odeList;.    whi
27b70 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70  le( pInode && (p
27b80 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65  Inode->fileId.de
27b90 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a  v!=sStat.st_dev.
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e       || pInode->
27bc0 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61  fileId.ino!=sSta
27bd0 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20  t.st_ino) ){.   
27be0 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
27bf0 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
27c00 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  }.    if( pInode
27c10 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e   ){.      UnixUn
27c20 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20  usedFd **pp;.   
27c30 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64     for(pp=&pInod
27c40 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20  e->pUnused; *pp 
27c50 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21  && (*pp)->flags!
27c60 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70  =flags; pp=&((*p
27c70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20  p)->pNext));.   
27c80 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70     pUnused = *pp
27c90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75  ;.      if( pUnu
27ca0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  sed ){.        *
27cb0 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e  pp = pUnused->pN
27cc0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
27cd0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
27ce0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
27cf0 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53  dif    /* if !OS
27d00 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65  _VXWORKS */.  re
27d10 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a  turn pUnused;.}.
27d20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
27d30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
27d40 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20  y unixOpen() to 
27d50 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e  determine the un
27d60 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ix permissions.*
27d70 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20  * to create new 
27d80 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e  files with. If n
27d90 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
27da0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
27db0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
27dc0 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62  d a value suitab
27dd0 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61  le for passing a
27de0 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
27df0 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20  ment to open(2) 
27e00 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  is.** written to
27e10 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49   *pMode. If an I
27e20 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
27e30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
27e40 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
27e50 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
27e60 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20  ue of *pMode is 
27e70 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  not modified..**
27e80 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
27e90 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20  being opened is 
27ea0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
27eb0 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 63  , it is always c
27ec0 72 65 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  reated with.** t
27ed0 68 65 20 6f 63 74 61 6c 20 70 65 72 6d 69 73 73  he octal permiss
27ee0 69 6f 6e 73 20 30 36 30 30 20 28 72 65 61 64 2f  ions 0600 (read/
27ef0 77 72 69 74 61 62 6c 65 20 62 79 20 6f 77 6e 65  writable by owne
27f00 72 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65 20  r only). If the 
27f10 66 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61 74  file.** is a dat
27f20 61 62 61 73 65 20 6f 72 20 6d 61 73 74 65 72 20  abase or master 
27f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74  journal file, it
27f40 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74 68   is created with
27f50 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
27f60 20 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45   .** mask SQLITE
27f70 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
27f80 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a  RMISSIONS..**.**
27f90 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65   Finally, if the
27fa0 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
27fb0 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72  ed is a WAL or r
27fc0 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
27fd0 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ile, then .** th
27fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72  is function quer
27ff0 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ies the file-sys
28000 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d  tem for the perm
28010 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a  issions on the .
28020 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
28030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
28040 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  nd sets *pMode t
28050 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68  o this value. Wh
28060 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69  enever .** possi
28070 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75  ble, WAL and jou
28080 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63  rnal files are c
28090 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
280a0 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
280b0 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73  s .** as the ass
280c0 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
280d0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
280e0 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
280f0 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69  E_8_3_NAMES opti
28100 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
28110 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  hen the.** origi
28120 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
28130 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  unavailable.  Bu
28140 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f  t 8_3_NAMES is o
28150 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  nly used for.** 
28160 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20  FAT filesystems 
28170 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  and permissions 
28180 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68  do not matter th
28190 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65  ere, so just use
281a0 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
281b0 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a  permissions..*/.
281c0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43  static int findC
281d0 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20  reateFileMode(. 
281e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
281f0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
28200 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65   /* Path of file
28210 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e   (possibly) bein
28220 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69  g created */.  i
28230 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
28240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28250 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61  * Flags passed a
28260 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74  s 4th argument t
28270 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d  o xOpen() */.  m
28280 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 20 20 20 20  ode_t *pMode    
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
282a0 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f  * OUT: Permissio
282b0 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  ns to open file 
282c0 77 69 74 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  with */.){.  int
282d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282f0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
28300 20 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45   *pMode = SQLITE
28310 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
28320 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 69 66 28  RMISSIONS;.  if(
28330 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45   flags & (SQLITE
28340 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
28350 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
28360 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  AL) ){.    char 
28370 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  zDb[MAX_PATHNAME
28380 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  +1];     /* Data
28390 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a  base file path *
283a0 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20  /.    int nDb;  
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
283d0 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20   valid bytes in 
283e0 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  zDb */.    struc
283f0 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
28400 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
28410 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20  ut of stat() on 
28420 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
28430 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69  ..    /* zPath i
28440 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41  s a path to a WA
28450 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  L or journal fil
28460 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
28470 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20   block derives. 
28480 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74     ** the path t
28490 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
284a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
284b0 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20  rom zPath. This 
284c0 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20  block handles.  
284d0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
284e0 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e  ng naming conven
284f0 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  tions:.    **.  
28500 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
28510 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20   db>-journal".  
28520 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
28530 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a   db>-wal".    **
28540 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
28550 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20  -journalNN".    
28560 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
28570 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  b>-walNN".    **
28580 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e  .    ** where NN
28590 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75   is a decimal nu
285a0 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d  mber. The NN nam
285b0 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20  ing schemes are 
285c0 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20  .    ** used by 
285d0 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c  the test_multipl
285e0 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20  ex.c module..   
285f0 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71   */.    nDb = sq
28600 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
28610 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65  ath) - 1; .#ifde
28620 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
28630 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68  8_3_NAMES.    wh
28640 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 21 73  ile( nDb>0 && !s
28650 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50  qlite3Isalnum(zP
28660 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d  ath[nDb]) ) nDb-
28670 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d  -;.    if( nDb==
28680 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21  0 || zPath[nDb]!
28690 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51  ='-' ) return SQ
286a0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
286b0 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b     while( zPath[
286c0 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  nDb]!='-' ){.   
286d0 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30     assert( nDb>0
286e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
286f0 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c  ( zPath[nDb]!='\
28700 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d  n' );.      nDb-
28710 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  -;.    }.#endif.
28720 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
28730 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
28740 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
28750 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73  ;..    if( 0==os
28760 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74  Stat(zDb, &sStat
28770 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64  ) ){.      *pMod
28780 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64  e = sStat.st_mod
28790 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 7d 65  e & 0777;.    }e
287a0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
287b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
287c0 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AT;.    }.  }els
287d0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
287e0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
287f0 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a  ONCLOSE ){.    *
28800 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20  pMode = 0600;.  
28810 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28820 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
28830 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20   file zPath..** 
28840 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20  .** Previously, 
28850 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61  the SQLite OS la
28860 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66  yer used three f
28870 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63  unctions in plac
28880 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65  e of this.** one
28890 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
288a0 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
288b0 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  te();.**     sql
288c0 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
288d0 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  ly();.**     sql
288e0 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
288f0 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ive();.**.** The
28900 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70  se calls corresp
28910 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ond to the follo
28920 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
28930 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  s of flags:.**.*
28940 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28  *     ReadWrite(
28950 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52  ) ->     (READWR
28960 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a  ITE | CREATE).**
28970 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20       ReadOnly() 
28980 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c   ->     (READONL
28990 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45  Y) .**     OpenE
289a0 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52  xclusive() -> (R
289b0 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
289c0 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a  E | EXCLUSIVE).*
289d0 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65  *.** The old Ope
289e0 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63  nExclusive() acc
289f0 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20  epted a boolean 
28a00 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46  argument - "delF
28a10 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65  lag". If.** true
28a20 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63  , the file was c
28a30 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20  onfigured to be 
28a40 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
28a50 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  leted when the.*
28a60 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c  * file handle cl
28a70 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65  osed. To achieve
28a80 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74   the same effect
28a90 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20   using this new 
28aa0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61  .** interface, a
28ab0 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43  dd the DELETEONC
28ac0 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f  LOSE flag to tho
28ad0 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f  se specified abo
28ae0 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45  ve for .** OpenE
28af0 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73  xclusive()..*/.s
28b00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
28b10 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
28b20 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
28b30 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f     /* The VFS fo
28b40 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
28b50 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64  the xOpen method
28b60 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28b70 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
28b80 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f     /* Pathname o
28b90 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65  f file to be ope
28ba0 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
28bb0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
28bc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
28bd0 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
28be0 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a  be filled in */.
28bf0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28c10 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f  * Input flags to
28c20 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65   control the ope
28c30 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ning */.  int *p
28c40 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
28c50 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
28c60 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
28c70 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  to SQLite core *
28c80 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
28c90 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  *p = (unixFile *
28ca0 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64  )pFile;.  int fd
28cb0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
28cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
28cd0 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
28ce0 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
28cf0 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
28d00 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
28d10 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
28d20 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
28d30 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
28d40 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
28d50 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
28d60 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
28d70 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28d90 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
28da0 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
28db0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
28dc0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
28dd0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
28de0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
28df0 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
28e00 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
28e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
28e20 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
28e30 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
28e40 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
28e50 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
28e60 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
28e70 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
28e80 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
28e90 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
28ea0 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
28eb0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
28ec0 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
28ed0 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
28ee0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
28ef0 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23  EN_READWRITE);.#
28f00 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
28f10 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
28f20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79   int isAutoProxy
28f30 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
28f40 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
28f50 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  XY);.#endif.#if 
28f60 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
28f70 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
28f80 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
28f90 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
28fa0 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66  s fsInfo;.#endif
28fb0 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
28fc0 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
28fd0 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
28fe0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
28ff0 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
29000 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
29010 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
29020 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
29030 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
29040 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
29050 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
29060 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
29070 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
29080 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
29090 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
290a0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
290b0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
290c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
290d0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
290e0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
290f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
29100 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
29110 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
29120 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
29130 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
29140 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
29150 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
29160 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
29170 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
29180 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
29190 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
291a0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
291b0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
291c0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
291d0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
291e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
291f0 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
29200 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
29210 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
29220 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
29230 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
29240 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
29250 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
29260 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
29270 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
29280 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
29290 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
292a0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
292b0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
292c0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
292d0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
292e0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
292f0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
29300 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
29310 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
29320 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
29330 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
29340 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
29350 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
29360 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
29370 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
29380 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
29390 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
293a0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
293b0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
293c0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
293d0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
293e0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
293f0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
29400 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
29410 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
29420 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
29430 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
29440 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
29450 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
29460 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
29470 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
29480 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
29490 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
294a0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
294b0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
294c0 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
294d0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
294e0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
294f0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
29500 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
29510 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
29520 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
29530 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
29540 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
29550 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
29560 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
29570 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
29580 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
29590 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
295a0 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
295b0 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
295c0 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
295d0 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
295e0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
295f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29600 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
29610 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
29620 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
29630 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
29640 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
29650 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
29660 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
29670 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
29680 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29690 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
296a0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
296b0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
296c0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
296d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
296e0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
296f0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29700 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
29710 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
29720 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
29730 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
29740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29750 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
29760 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
29770 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
29780 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
29790 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
297a0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
297b0 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
297c0 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
297d0 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
297e0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
297f0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  oc(sizeof(*pUnus
29800 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
29810 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
29820 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29830 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
29840 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55  .    }.    p->pU
29850 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
29860 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e  .  }else if( !zN
29870 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ame ){.    /* If
29880 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20   zName is NULL, 
29890 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
298a0 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  is requesting a 
298b0 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  temp file. */.  
298c0 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
298d0 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a  e && !syncDir);.
298e0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74      rc = unixGet
298f0 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54  Tempname(MAX_PAT
29900 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d  HNAME+1, zTmpnam
29910 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
29920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29930 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29940 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
29950 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
29960 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
29970 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
29980 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70  lags parameter p
29990 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66  assed to POSIX f
299a0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  unction.  ** ope
299b0 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20  n(). These must 
299c0 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76  be calculated ev
299d0 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20  en if open() is 
299e0 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20  not called, as. 
299f0 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20   ** they may be 
29a00 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
29a10 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
29a20 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68  e and used by th
29a30 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66  e .  ** 'conch f
29a40 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e  ile' locking fun
29a50 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e  ctions later on.
29a60 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61    */.  if( isRea
29a70 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61  donly )  openFla
29a80 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
29a90 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
29aa0 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
29ab0 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
29ac0 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65  sCreate )    ope
29ad0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  nFlags |= O_CREA
29ae0 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
29af0 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  sive ) openFlags
29b00 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
29b10 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46  FOLLOW);.  openF
29b20 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45  lags |= (O_LARGE
29b30 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
29b40 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
29b50 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f     mode_t openMo
29b60 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
29b70 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
29b80 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
29b90 69 74 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ith */.    rc = 
29ba0 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
29bb0 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  de(zName, flags,
29bc0 20 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20   &openMode);.   
29bd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29be0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
29bf0 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20  rt( !p->pUnused 
29c00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29c10 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
29c20 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65  PEN_WAL || eType
29c30 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
29c40 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
29c50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29c60 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f     }.    fd = ro
29c70 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
29c80 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
29c90 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  Mode);.    OSTRA
29ca0 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33  CE(("OPENX   %-3
29cb0 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c  d %s 0%o\n", fd,
29cc0 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67   zName, openFlag
29cd0 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  s));.    if( fd<
29ce0 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44  0 && errno!=EISD
29cf0 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
29d00 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
29d10 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61  e ){.      /* Fa
29d20 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
29d30 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
29d40 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
29d50 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
29d60 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
29d70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
29d80 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
29d90 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
29da0 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28   openFlags &= ~(
29db0 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b  O_RDWR|O_CREAT);
29dc0 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
29dd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
29de0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ONLY;.      open
29df0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
29e00 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  Y;.      isReado
29e10 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  nly = 1;.      f
29e20 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
29e30 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
29e40 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
29e50 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
29e60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
29e70 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
29e80 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
29e90 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "open", zName);
29ea0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
29eb0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
29ec0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66  .  }.  assert( f
29ed0 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  d>=0 );.  if( pO
29ee0 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a  utFlags ){.    *
29ef0 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  pOutFlags = flag
29f00 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  s;.  }..  if( p-
29f10 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  >pUnused ){.    
29f20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  p->pUnused->fd =
29f30 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75   fd;.    p->pUnu
29f40 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  sed->flags = fla
29f50 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  gs;.  }..  if( i
29f60 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f  sDelete ){.#if O
29f70 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50  S_VXWORKS.    zP
29f80 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c  ath = zName;.#el
29f90 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  se.    osUnlink(
29fa0 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zName);.#endif. 
29fb0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   }.#if SQLITE_EN
29fc0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29fd0 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70  LE.  else{.    p
29fe0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
29ff0 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e  enFlags;.  }.#en
2a000 64 69 66 0a 0a 23 69 66 64 65 66 20 46 44 5f 43  dif..#ifdef FD_C
2a010 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63 6e 74 6c  LOEXEC.  osFcntl
2a020 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
2a030 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
2a040 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
2a050 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e  EC);.#endif..  n
2a060 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
2a070 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2a080 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69  DB;..  .#if defi
2a090 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
2a0a0 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2a0b0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2a0c0 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20  if( fstatfs(fd, 
2a0d0 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
2a0e0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2a0f0 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
2a100 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
2a110 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
2a120 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
2a130 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a140 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
2a150 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
2a160 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20  trncmp("msdos", 
2a170 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2a180 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
2a190 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
2a1a0 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
2a1b0 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
2a1c0 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69  MSDOS;.  }.#endi
2a1d0 66 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.  .#if SQLITE_
2a1e0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a1f0 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f  TYLE.#if SQLITE_
2a200 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2a210 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f  KING.  isAutoPro
2a220 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  xy = 1;.#endif. 
2a230 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79   if( isAutoProxy
2a240 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c   && (zPath!=NULL
2a250 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26  ) && (!noLock) &
2a260 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b  & pVfs->xOpen ){
2a270 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f  .    char *envfo
2a280 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51  rce = getenv("SQ
2a290 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2a2a0 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20  _LOCKING");.    
2a2b0 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30  int useProxy = 0
2a2c0 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ;..    /* SQLITE
2a2d0 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2a2e0 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f  KING==1 means fo
2a2f0 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70  rce always use p
2a300 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20  roxy, 0 means . 
2a310 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20     ** never use 
2a320 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e  proxy, NULL mean
2a330 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20  s use proxy for 
2a340 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20  non-local files 
2a350 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  only.  */.    if
2a360 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c  ( envforce!=NULL
2a370 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f   ){.      usePro
2a380 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72  xy = atoi(envfor
2a390 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ce)>0;.    }else
2a3a0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74  {.      if( stat
2a3b0 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66  fs(zPath, &fsInf
2a3c0 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
2a3d0 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
2a3e0 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20  , the close(fd) 
2a3f0 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69  call is sub-opti
2a400 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65  mal. If the file
2a410 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20   opened.        
2a420 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20  ** with fd is a 
2a430 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2a440 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  nd there are oth
2a450 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  er connections o
2a460 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
2a470 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
2a480 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68   are currently h
2a490 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20  olding advisory 
2a4a0 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20  locks on it,.   
2a4b0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
2a4c0 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29   call to close()
2a4d0 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f   will cancel tho
2a4e0 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61  se locks. In pra
2a4f0 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a  ctice,.        *
2a500 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
2a510 20 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64   that statfs() d
2a520 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79  oesn't fail very
2a530 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74   often. At least
2a540 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2a550 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65  while other file
2a560 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2a570 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
2a580 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20  process on.     
2a590 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66     ** the same f
2a5a0 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e  ile are working.
2a5b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e    */.        p->
2a5c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
2a5d0 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  o;.        robus
2a5e0 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
2a5f0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2a600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2a610 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20  ERR_ACCESS;.    
2a620 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
2a630 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nished;.      }.
2a640 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
2a650 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67   !(fsInfo.f_flag
2a660 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20  s&MNT_LOCAL);.  
2a670 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50    }.    if( useP
2a680 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
2a690 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
2a6a0 65 28 70 56 66 73 2c 20 66 64 2c 20 73 79 6e 63  e(pVfs, fd, sync
2a6b0 44 69 72 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74  Dir, pFile, zPat
2a6c0 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20  h, noLock,.     
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6e0 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69       isDelete, i
2a6f0 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20  sReadonly);.    
2a700 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a710 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2a720 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
2a730 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78  rmUnixFile((unix
2a740 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61  File*)pFile, ":a
2a750 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  uto:");.        
2a760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a770 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
2a780 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20  * Use unixClose 
2a790 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
2a7a0 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20  resources added 
2a7b0 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  in fillInUnixFil
2a7c0 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
2a7d0 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68  and clear all th
2a7e0 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65  e structure's re
2a7f0 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69  ferences.  Speci
2a800 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20  fically, .      
2a810 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d      ** pFile->pM
2a820 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e  ethods will be N
2a830 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73  ULL so sqlite3Os
2a840 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20  Close will be a 
2a850 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20  no-op .         
2a860 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
2a870 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a  ixClose(pFile);.
2a880 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2a890 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2a8a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
2a8b0 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
2a8c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2a8d0 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  f.  .  rc = fill
2a8e0 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
2a8f0 20 66 64 2c 20 73 79 6e 63 44 69 72 2c 20 70 46   fd, syncDir, pF
2a900 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f  ile, zPath, noLo
2a910 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
2a920 20 20 20 20 20 20 20 20 20 20 69 73 44 65 6c 65            isDele
2a930 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b  te, isReadonly);
2a940 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a  .open_finished:.
2a950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a960 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2a970 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73  e3_free(p->pUnus
2a980 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ed);.  }.  retur
2a990 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2a9a0 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
2a9b0 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
2a9c0 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
2a9d0 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
2a9e0 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
2a9f0 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
2aa00 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
2aa10 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
2aa20 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
2aa30 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
2aa40 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69     /* VFS contai
2aa50 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65  ning this as the
2aa60 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20   xDelete method 
2aa70 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2aa80 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f  *zPath,        /
2aa90 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
2aaa0 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
2aab0 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20    int dirSync   
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2aad0 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20  f true, fsync() 
2aae0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
2aaf0 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f  deleting file */
2ab00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2ab10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53  QLITE_OK;.  UNUS
2ab20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2ab30 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
2ab40 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
2ab50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2ab60 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e  ETE);.  if( osUn
2ab70 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31  link(zPath)==(-1
2ab80 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45  ) && errno!=ENOE
2ab90 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  NT ){.    return
2aba0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2abb0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2abc0 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61  E, "unlink", zPa
2abd0 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  th);.  }.#ifndef
2abe0 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2abf0 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69  DIRSYNC.  if( di
2ac00 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74  rSync ){.    int
2ac10 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73   fd;.    rc = os
2ac20 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  OpenDirectory(zP
2ac30 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69  ath, &fd);.    i
2ac40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ac50 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
2ac60 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  KS.      if( fsy
2ac70 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c  nc(fd)==-1 ).#el
2ac80 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  se.      if( fsy
2ac90 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a  nc(fd) ).#endif.
2aca0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2acb0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
2acc0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
2acd0 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63  IR_FSYNC, "fsync
2ace0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ", zPath);.     
2acf0 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f   }.      robust_
2ad00 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
2ad10 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
2ad20 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2ad30 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
2ad40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ad50 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  K;.    }.  }.#en
2ad60 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
2ad70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
2ad80 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
2ad90 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
2ada0 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
2adb0 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
2adc0 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
2add0 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
2ade0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2adf0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2ae00 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
2ae10 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
2ae20 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
2ae30 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
2ae40 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
2ae50 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
2ae60 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
2ae70 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
2ae80 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
2ae90 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2aea0 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
2aeb0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2aec0 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
2aed0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
2aee0 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
2aef0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
2af00 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61  /* The VFS conta
2af10 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65  ining this xAcce
2af20 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  ss method */.  c
2af30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2af40 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f  ,      /* Path o
2af50 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78  f the file to ex
2af60 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66  amine */.  int f
2af70 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2af80 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65     /* What do we
2af90 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61   want to learn a
2afa0 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66  bout the zPath f
2afb0 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ile? */.  int *p
2afc0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
2afd0 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
2afe0 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a  t boolean here *
2aff0 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65  /.){.  int amode
2b000 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
2b010 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2b020 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
2b030 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2b040 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
2b050 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ; );.  switch( f
2b060 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
2b070 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2b080 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f  XISTS:.      amo
2b090 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20  de = F_OK;.     
2b0a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2b0b0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2b0c0 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
2b0d0 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f  amode = W_OK|R_O
2b0e0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
2b0f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2b100 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
2b110 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b     amode = R_OK;
2b120 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2b130 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2b140 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
2b150 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
2b160 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
2b170 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28  Out = (osAccess(
2b180 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
2b190 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  );.  if( flags==
2b1a0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2b1b0 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74  ISTS && *pResOut
2b1c0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
2b1d0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28  tat buf;.    if(
2b1e0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2b1f0 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73  , &buf) && buf.s
2b200 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  t_size==0 ){.   
2b210 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b     *pResOut = 0;
2b220 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2b230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b240 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
2b250 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2b260 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
2b270 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
2b280 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
2b290 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
2b2a0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
2b2b0 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
2b2c0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
2b2d0 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
2b2e0 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
2b2f0 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
2b300 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
2b310 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
2b320 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
2b330 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
2b340 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
2b350 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
2b360 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
2b370 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
2b380 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2b390 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
2b3a0 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
2b3b0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2b3c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2b3d0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
2b3e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b3f0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2b400 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
2b410 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
2b420 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
2b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b440 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
2b450 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
2b460 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
2b470 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
2b480 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2b490 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
2b4a0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
2b4b0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
2b4c0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
2b4d0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
2b4e0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
2b4f0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
2b500 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
2b510 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
2b520 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
2b530 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
2b540 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
2b550 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
2b560 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
2b570 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
2b580 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
2b590 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
2b5a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
2b5b0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2b5c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2b5d0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  );..  assert( pV
2b5e0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
2b5f0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
2b600 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b610 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75  ER(pVfs);..  zOu
2b620 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27  t[nOut-1] = '\0'
2b630 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
2b640 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='/' ){.    sql
2b650 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
2b660 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20  ut, zOut, "%s", 
2b670 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
2b680 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20  .    int nCwd;. 
2b690 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28     if( osGetcwd(
2b6a0 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30  zOut, nOut-1)==0
2b6b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b6c0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2b6d0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2b6e0 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50  PT, "getcwd", zP
2b6f0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
2b700 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c  nCwd = (int)strl
2b710 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  en(zOut);.    sq
2b720 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2b730 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b  Out-nCwd, &zOut[
2b740 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50  nCwd], "/%s", zP
2b750 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ath);.  }.  retu
2b760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2b770 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2b780 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2b790 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
2b7a0 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
2b7b0 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
2b7c0 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
2b7d0 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
2b7e0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
2b7f0 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
2b800 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
2b810 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  brary..*/.#inclu
2b820 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61  de <dlfcn.h>.sta
2b830 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
2b840 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
2b850 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *NotUsed, const
2b860 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2b870 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2b880 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2b890 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28    return dlopen(
2b8a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f  zFilename, RTLD_
2b8b0 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41  NOW | RTLD_GLOBA
2b8c0 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  L);.}../*.** SQL
2b8d0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
2b8e0 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74  unction immediat
2b8f0 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ely after a call
2b900 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20   to unixDlSym() 
2b910 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e  or.** unixDlOpen
2b920 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e  () fails (return
2b930 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
2b940 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74  ). If a more det
2b950 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  ailed error.** m
2b960 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61  essage is availa
2b970 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74  ble, it is writt
2b980 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49  en to zBufOut. I
2b990 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  f no error messa
2b9a0 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ge.** is availab
2b9b0 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c  le, zBufOut is l
2b9c0 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61  eft unmodified a
2b9d0 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61  nd SQLite uses a
2b9e0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f   default.** erro
2b9f0 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
2ba00 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
2ba10 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2ba20 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2ba30 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2ba40 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Out){.  const ch
2ba50 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53  ar *zErr;.  UNUS
2ba60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2ba70 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74  Used);.  unixEnt
2ba80 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72  erMutex();.  zEr
2ba90 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20  r = dlerror();. 
2baa0 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
2bab0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2bac0 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c  f(nBuf, zBufOut,
2bad0 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20   "%s", zErr);.  
2bae0 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
2baf0 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ex();.}.static v
2bb00 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28  oid (*unixDlSym(
2bb10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2bb20 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63  Used, void *p, c
2bb30 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29  onst char*zSym))
2bb40 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20  (void){.  /* .  
2bb50 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64  ** GCC with -ped
2bb60 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79  antic-errors say
2bb70 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20  s that C90 does 
2bb80 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64  not allow a void
2bb90 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73  * to be.  ** cas
2bba0 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  t into a pointer
2bbb0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
2bbc0 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62   And yet the lib
2bbd0 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75  rary dlsym() rou
2bbe0 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e  tine.  ** return
2bbf0 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20  s a void* which 
2bc00 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
2bc10 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2bc20 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65  n.  So how do we
2bc30 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28  .  ** use dlsym(
2bc40 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  ) with -pedantic
2bc50 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20  -errors?.  **.  
2bc60 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65  ** Variable x be
2bc70 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74  low is defined t
2bc80 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  o be a pointer t
2bc90 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  o a function tak
2bca0 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74  ing.  ** paramet
2bcb0 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f  ers void* and co
2bcc0 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65  nst char* and re
2bcd0 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65  turning a pointe
2bce0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
2bcf0 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c  .  ** We initial
2bd00 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69  ize x by assigni
2bd10 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20  ng it a pointer 
2bd20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66  to the dlsym() f
2bd30 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54  unction..  ** (T
2bd40 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72  hat assignment r
2bd50 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29  equires a cast.)
2bd60 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74    Then we call t
2bd70 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  he function that
2bd80 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74  .  ** x points t
2bd90 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  o.  .  **.  ** T
2bda0 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
2bdb0 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77  is unlikely to w
2bdc0 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e  ork correctly on
2bdd0 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72   any system wher
2bde0 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c  e.  ** you reall
2bdf0 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20  y cannot cast a 
2be00 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
2be10 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75   into void*.  Bu
2be20 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20  t then, on the. 
2be30 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20   ** other hand, 
2be40 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74  dlsym() will not
2be50 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20   work on such a 
2be60 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73  system either, s
2be70 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e  o we have.  ** n
2be80 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61  ot really lost a
2be90 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  nything..  */.  
2bea0 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64  void (*(*x)(void
2beb0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
2bec0 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  void);.  UNUSED_
2bed0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2bee0 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28  d);.  x = (void(
2bef0 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  *(*)(void*,const
2bf00 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64   char*))(void))d
2bf10 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28  lsym;.  return (
2bf20 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  *x)(p, zSym);.}.
2bf30 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2bf40 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
2bf50 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
2bf60 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
2bf70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2bf80 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63  (NotUsed);.  dlc
2bf90 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
2bfa0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
2bfb0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
2bfc0 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
2bfd0 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
2bfe0 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20   unixDlOpen  0. 
2bff0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45   #define unixDlE
2c000 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
2c010 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20   unixDlSym   0. 
2c020 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43   #define unixDlC
2c030 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
2c040 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20  *.** Write nBuf 
2c050 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  bytes of random 
2c060 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70  data to the supp
2c070 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66  lied buffer zBuf
2c080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c090 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73  unixRandomness(s
2c0a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2c0b0 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
2c0c0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
2c0d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2c0e0 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72  otUsed);.  asser
2c0f0 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d  t((size_t)nBuf>=
2c100 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b  (sizeof(time_t)+
2c110 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a  sizeof(int)));..
2c120 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
2c130 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
2c140 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
2c150 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
2c160 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
2c170 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
2c180 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
2c190 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
2c1a0 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
2c1b0 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
2c1c0 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
2c1d0 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
2c1e0 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
2c1f0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
2c200 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
2c210 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
2c220 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
2c230 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
2c240 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
2c250 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
2c260 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
2c270 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
2c280 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
2c290 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
2c2a0 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
2c2b0 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
2c2c0 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
2c2d0 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
2c2e0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
2c2f0 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
2c300 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
2c310 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
2c320 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
2c330 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
2c340 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
2c350 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
2c360 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  ence.  This make
2c370 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
2c380 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
2c390 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
2c3a0 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21   0, nBuf);.#if !
2c3b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2c3c0 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  EST).  {.    int
2c3d0 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64   pid, fd;.    fd
2c3e0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22   = robust_open("
2c3f0 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
2c400 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  _RDONLY, 0);.   
2c410 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2c420 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
2c430 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20     time(&t);.   
2c440 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
2c450 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
2c460 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70        pid = getp
2c470 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  id();.      memc
2c480 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
2c490 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  t)], &pid, sizeo
2c4a0 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61  f(pid));.      a
2c4b0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29  ssert( sizeof(t)
2c4c0 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73  +sizeof(pid)<=(s
2c4d0 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20  ize_t)nBuf );.  
2c4e0 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f      nBuf = sizeo
2c4f0 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69  f(t) + sizeof(pi
2c500 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
2c510 20 20 20 20 20 64 6f 7b 20 6e 42 75 66 20 3d 20       do{ nBuf = 
2c520 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c  osRead(fd, zBuf,
2c530 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20   nBuf); }while( 
2c540 6e 42 75 66 3c 30 20 26 26 20 65 72 72 6e 6f 3d  nBuf<0 && errno=
2c550 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
2c560 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
2c570 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2c580 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2c590 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d    return nBuf;.}
2c5a0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
2c5b0 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
2c5c0 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
2c5d0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
2c5e0 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75  ept..** The argu
2c5f0 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62  ment is the numb
2c600 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
2c610 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c  ds we want to sl
2c620 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  eep..** The retu
2c630 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
2c640 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
2c650 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20  econds of sleep 
2c660 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75  actually.** requ
2c670 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75  ested from the u
2c680 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
2c690 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75  ing system, a nu
2c6a0 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69  mber which.** mi
2c6b0 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
2c6c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
2c6d0 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75  the argument, bu
2c6e0 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68  t not less.** th
2c6f0 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  an the argument.
2c700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2c710 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33  nixSleep(sqlite3
2c720 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
2c730 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  nt microseconds)
2c740 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
2c750 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
2c760 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f  ec sp;..  sp.tv_
2c770 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e  sec = microsecon
2c780 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20  ds / 1000000;.  
2c790 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69  sp.tv_nsec = (mi
2c7a0 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30  croseconds % 100
2c7b0 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20  0000) * 1000;.  
2c7c0 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e  nanosleep(&sp, N
2c7d0 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ULL);.  UNUSED_P
2c7e0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2c7f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
2c800 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20  oseconds;.#elif 
2c810 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
2c820 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
2c830 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
2c840 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  roseconds);.  UN
2c850 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2c860 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
2c870 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
2c880 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f  #else.  int seco
2c890 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  nds = (microseco
2c8a0 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30  nds+999999)/1000
2c8b0 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63  000;.  sleep(sec
2c8c0 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
2c8d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2c8e0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63  d);.  return sec
2c8f0 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65  onds*1000000;.#e
2c900 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
2c910 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
2c920 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
2c930 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
2c940 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
2c950 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
2c960 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
2c970 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
2c980 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
2c990 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
2c9a0 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
2c9b0 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
2c9c0 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
2c9d0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
2c9e0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2c9f0 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
2ca00 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
2ca10 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
2ca20 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
2ca30 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2ca40 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2ca50 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2ca60 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2ca70 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
2ca80 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2ca90 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
2caa0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
2cab0 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
2cac0 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
2cad0 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
2cae0 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
2caf0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
2cb00 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
2cb10 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
2cb20 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
2cb30 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
2cb40 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
2cb50 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
2cb60 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
2cb70 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
2cb80 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
2cb90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cba0 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
2cbb0 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
2cbc0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a  ime and date .**
2cbd0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2cbe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cbf0 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
2cc00 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
2cc10 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74   *NotUsed, sqlit
2cc20 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
2cc30 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
2cc40 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
2cc50 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
2cc60 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
2cc70 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e  64)8640000;.  in
2cc80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2cc90 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  ;.#if defined(NO
2cca0 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f  _GETTOD).  time_
2ccb0 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b  t t;.  time(&t);
2ccc0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71  .  *piNow = ((sq
2ccd0 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31  lite3_int64)t)*1
2cce0 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  000 + unixEpoch;
2ccf0 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b  .#elif OS_VXWORK
2cd00 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
2cd10 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63  pec sNow;.  cloc
2cd20 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f  k_gettime(CLOCK_
2cd30 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29  REALTIME, &sNow)
2cd40 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
2cd50 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
2cd60 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
2cd70 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
2cd80 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b  tv_nsec/1000000;
2cd90 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
2cda0 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20  timeval sNow;.  
2cdb0 69 66 28 20 67 65 74 74 69 6d 65 6f 66 64 61 79  if( gettimeofday
2cdc0 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20 29 7b  (&sNow, 0)==0 ){
2cdd0 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e  .    *piNow = un
2cde0 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28  ixEpoch + 1000*(
2cdf0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e  sqlite3_int64)sN
2ce00 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77  ow.tv_sec + sNow
2ce10 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 20  .tv_usec/1000;. 
2ce20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2ce30 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2ce40 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
2ce50 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2ce60 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
2ce70 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
2ce80 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
2ce90 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
2cea0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2ceb0 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
2cec0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
2ced0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2cee0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2cef0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  rc;.}../*.** Fin
2cf00 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2cf10 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2cf20 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2cf30 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
2cf40 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
2cf50 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
2cf60 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
2cf70 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
2cf80 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
2cf90 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
2cfa0 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
2cfb0 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
2cfc0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
2cfd0 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
2cfe0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2cff0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
2d000 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2d010 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  i = 0;.  int rc;
2d020 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d030 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2d040 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e 74  rc = unixCurrent
2d050 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29  TimeInt64(0, &i)
2d060 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38  ;.  *prNow = i/8
2d070 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74  6400000.0;.  ret
2d080 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d090 20 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47   We added the xG
2d0a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65  etLastError() me
2d0b0 74 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e  thod with the in
2d0c0 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69  tention of provi
2d0d0 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c  ding.** better l
2d0e0 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d  ow-level error m
2d0f0 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65  essages when ope
2d100 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72  rating-system pr
2d110 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a  oblems come up.*
2d120 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20  * during SQLite 
2d130 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
2d140 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20  so far, none of 
2d150 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d  that has been im
2d160 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20  plemented.** in 
2d170 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68  the core.  So th
2d180 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
2d190 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72  ver called.  For
2d1a0 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65   now, it is mere
2d1b0 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f  ly.** a place-ho
2d1c0 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lder..*/.static 
2d1d0 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45  int unixGetLastE
2d1e0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2d1f0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
2d200 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e  otUsed2, char *N
2d210 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53  otUsed3){.  UNUS
2d220 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2d230 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Used);.  UNUSED_
2d240 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2d250 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2);.  UNUSED_PA
2d260 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33  RAMETER(NotUsed3
2d270 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
2d280 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../*.**********
2d290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
2d2a0 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  nd of sqlite3_vf
2d2b0 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
2d2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2d0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2d2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d320 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
2d330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d370 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2d380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d390 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f  * Begin Proxy Lo
2d3a0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
2d3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d3c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f  ******.**.** Pro
2d3d0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20  xy locking is a 
2d3e0 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65  "uber-locking-me
2d3f0 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65  thod" in this se
2d400 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68  nse:  It uses th
2d410 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  e.** other locki
2d420 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65  ng methods on se
2d430 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c  condary lock fil
2d440 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69  es.  Proxy locki
2d450 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d  ng is a.** meta-
2d460 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f  layer over top o
2d470 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  f the primitive 
2d480 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
2d490 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a  ted above.  For.
2d4a0 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  ** this reason, 
2d4b0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
2d4c0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20  t implements of 
2d4d0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
2d4e0 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74   deferred.** unt
2d4f0 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66  il late in the f
2d500 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72  ile (here) after
2d510 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65   all of the othe
2d520 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61  r I/O methods ha
2d530 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e  ve.** been defin
2d540 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65  ed - so that the
2d550 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
2d560 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61  ng methods are a
2d570 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73  vailable.** as s
2d580 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20  ervices to help 
2d590 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65  with the impleme
2d5a0 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79  ntation of proxy
2d5b0 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a   locking..**.***
2d5c0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  *.**.** The defa
2d5d0 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  ult locking sche
2d5e0 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73  mes in SQLite us
2d5f0 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
2d600 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ks on the.** dat
2d610 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f  abase file to co
2d620 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63  ordinate safe, c
2d630 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73  oncurrent access
2d640 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61   by multiple rea
2d650 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74  ders.** and writ
2d660 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69  ers [http://sqli
2d670 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33  te.org/lockingv3
2d680 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76  .html].  The fiv
2d690 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a  e file locking.*
2d6a0 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b  * states (UNLOCK
2d6b0 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41  ED, PENDING, SHA
2d6c0 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45  RED, RESERVED, E
2d6d0 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d  XCLUSIVE) are im
2d6e0 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20  plemented.** as 
2d6f0 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69  POSIX read & wri
2d700 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69  te locks over fi
2d710 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74  xed set of locat
2d720 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29  ions (via fsctl)
2d730 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20  ,.** on AFP and 
2d740 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69  SMB only exclusi
2d750 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  ve byte-range lo
2d760 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  cks are availabl
2d770 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77  e via fsctl.** w
2d780 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32  ith _IOWR('z', 2
2d790 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
2d7a0 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74  ngeLockPB2) to t
2d7b0 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20  rack the same 5 
2d7c0 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69  states..** To si
2d7d0 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b  mulate a F_RDLCK
2d7e0 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   on the shared r
2d7f0 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72  ange, on AFP a r
2d800 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64  andomly selected
2d810 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74  .** address in t
2d820 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  he shared range 
2d830 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53  is taken for a S
2d840 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
2d850 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64  entire.** shared
2d860 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
2d870 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  for an EXCLUSIVE
2d880 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   lock):.**.**   
2d890 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20     PENDING_BYTE 
2d8a0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
2d8b0 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20  0..   ..**      
2d8c0 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20  RESERVED_BYTE   
2d8d0 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a      0x40000001.*
2d8e0 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41  *      SHARED_RA
2d8f0 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30  NGE        0x400
2d900 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30  00002 -> 0x40000
2d910 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  200.**.** This w
2d920 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65  orks well on the
2d930 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
2d940 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20  em, but shows a 
2d950 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73  nearly 100x.** s
2d960 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20  lowdown in read 
2d970 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41  performance on A
2d980 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41  FP because the A
2d990 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c  FP client disabl
2d9a0 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63  es.** the read c
2d9b0 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72  ache when byte-r
2d9c0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70  ange locks are p
2d9d0 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e  resent.  Enablin
2d9e0 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61  g the read.** ca
2d9f0 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61  che exposes a ca
2da00 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72  che coherency pr
2da10 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72  oblem that is pr
2da20 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20  esent on all OS 
2da30 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e  X.** supported n
2da40 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74  etwork file syst
2da50 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46  ems.  NFS and AF
2da60 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74  P both observe t
2da70 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f  he.** close-to-o
2da80 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f  pen semantics fo
2da90 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65  r ensuring cache
2daa0 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68   coherency.** [h
2dab0 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65  ttp://nfs.source
2dac0 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61  forge.net/#faq_a
2dad0 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e  8], which does n
2dae0 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a  ot effectively.*
2daf0 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65  * address the re
2db00 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63  quirements for c
2db10 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  oncurrent databa
2db20 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  se access by mul
2db30 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73  tiple.** readers
2db40 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20   and writers.** 
2db50 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62  [http://www.nabb
2db60 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e  le.com/SQLite-on
2db70 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72  -NFS-cache-coher
2db80 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e  ency-td15655701.
2db90 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  html]..**.** To 
2dba0 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66  address the perf
2dbb0 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68  ormance and cach
2dbc0 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75  e coherency issu
2dbd0 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c  es, proxy file l
2dbe0 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  ocking.** change
2dbf0 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61  s the way databa
2dc00 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e  se access is con
2dc10 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74  trolled by limit
2dc20 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a  ing access to a.
2dc30 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61  ** single host a
2dc40 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76  t a time and mov
2dc50 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f  ing file locks o
2dc60 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
2dc70 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f  se file.** and o
2dc80 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65  nto a proxy file
2dc90 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
2dca0 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a  le system.  .**.
2dcb0 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78  **.** Using prox
2dcc0 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  y locks.** -----
2dcd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
2dce0 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20  ** C APIs.**.** 
2dcf0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
2dd00 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
2dd10 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
2dd20 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd40 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68       <proxy_path
2dd50 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a  > | ":auto:");.*
2dd60 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
2dd70 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
2dd80 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  me, SQLITE_GET_L
2dd90 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c  OCKPROXYFILE, &<
2dda0 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a  proxy_path>);.**
2ddb0 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d  .**.** SQL pragm
2ddc0 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41  as.**.**  PRAGMA
2ddd0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
2dde0 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f  _proxy_file=<pro
2ddf0 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f  xy_path> | :auto
2de00 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  :.**  PRAGMA [da
2de10 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
2de20 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70  xy_file.**.** Sp
2de30 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a  ecifying ":auto:
2de40 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  " means that if 
2de50 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68  there is a conch
2de60 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74   file with a mat
2de70 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44  ching.** host ID
2de80 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78   in it, the prox
2de90 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f  y path in the co
2dea0 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
2deb0 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65   used, otherwise
2dec0 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68  .** a proxy path
2ded0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73   based on the us
2dee0 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a  er's temp dir.**
2def0 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43   (via confstr(_C
2df00 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
2df10 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c  MP_DIR,...)) wil
2df20 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68  l be used and th
2df30 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78  e.** actual prox
2df40 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67  y file name is g
2df50 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
2df60 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20  e name and path 
2df70 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2df80 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78  se file.  For ex
2df90 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
2dfa0 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20     For database 
2dfb0 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f  path "/Users/me/
2dfc0 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20  foo.db" .**     
2dfd0 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20    The lock path 
2dfe0 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72  will be "<tmpdir
2dff0 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f  >/sqliteplocks/_
2e000 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a  Users_me_foo.db:
2e010 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e  auto:").**.** On
2e020 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20  ce a lock proxy 
2e030 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  is configured fo
2e040 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
2e050 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20  nection, it can 
2e060 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65  not.** be remove
2e070 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61  d, however it ma
2e080 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f  y be switched to
2e090 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
2e0a0 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74  xy path via.** t
2e0b0 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61  he above APIs (a
2e0c0 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63  ssuming the conc
2e0d0 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65  h file is not be
2e0e0 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74  ing held by anot
2e0f0 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  her.** connectio
2e100 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a  n or process). .
2e110 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f  **.**.** How pro
2e120 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  xy locking works
2e130 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
2e140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
2e150 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  * Proxy file loc
2e160 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d  king relies prim
2e170 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77  arily on two new
2e180 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65   supporting file
2e190 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63  s: .**.**   *  c
2e1a0 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d  onch file to lim
2e1b0 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  it access to the
2e1c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2e1d0 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a  o a single host.
2e1e0 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d  **      at a tim
2e1f0 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f  e.**.**   *  pro
2e200 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61  xy file to act a
2e210 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68  s a proxy for th
2e220 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  e advisory locks
2e230 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20   normally.**    
2e240 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64    taken on the d
2e250 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68  atabase.**.** Th
2e260 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74  e conch file - t
2e270 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69  o use a proxy fi
2e280 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20  le, sqlite must 
2e290 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20  first "hold the 
2e2a0 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b  conch".** by tak
2e2b0 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74  ing an sqlite-st
2e2c0 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  yle shared lock 
2e2d0 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
2e2e0 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a  e, reading the.*
2e2f0 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63  * contents and c
2e300 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73  omparing the hos
2e310 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20  t's unique host 
2e320 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61  ID (see below) a
2e330 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79  nd lock.** proxy
2e340 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68   path against th
2e350 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
2e360 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54  in the conch.  T
2e370 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
2e380 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68  .** stored in th
2e390 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
2e3a0 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
2e3b0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
2e3c0 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61  le name.** is pa
2e3d0 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68  tterned after th
2e3e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e3f0 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62  name as ".<datab
2e400 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e  asename>-conch".
2e410 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68  .** If the conch
2e420 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
2e430 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f  xist, or it's co
2e440 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  ntents do not ma
2e450 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20  tch the.** host 
2e460 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20  ID and/or proxy 
2e470 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c  path, then the l
2e480 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64  ock is escalated
2e490 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
2e4a0 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65  .** lock and the
2e4b0 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
2e4c0 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20  ents is updated 
2e4d0 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44  with the host ID
2e4e0 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61   and proxy.** pa
2e4f0 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  th and the lock 
2e500 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  is downgraded to
2e510 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
2e520 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f  gain.  If the co
2e530 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62  nch.** is held b
2e540 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  y another proces
2e550 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64  s (with a shared
2e560 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c   lock), the excl
2e570 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69  usive lock.** wi
2e580 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49  ll fail and SQLI
2e590 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
2e5a0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ned..**.** The p
2e5b0 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69  roxy file - a si
2e5c0 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75  ngle-byte file u
2e5d0 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69  sed for all advi
2e5e0 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a  sory file locks.
2e5f0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65  ** normally take
2e600 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
2e610 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61  e file.   This a
2e620 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73  llows for safe s
2e630 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65  haring.** of the
2e640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
2e650 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  or multiple read
2e660 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20  ers and writers 
2e670 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68  on the same.** h
2e680 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65  ost (the conch e
2e690 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79  nsures that they
2e6a0 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d   all use the sam
2e6b0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
2e6c0 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  e)..**.** Reques
2e6d0 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72  ting the lock pr
2e6e0 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d  oxy does not imm
2e6f0 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68  ediately take th
2e700 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a  e conch, it is.*
2e710 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65  * only taken whe
2e720 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  n the first requ
2e730 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61  est to lock data
2e740 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64  base file is mad
2e750 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74  e.  .** This mat
2e760 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69  ches the semanti
2e770 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74  cs of the tradit
2e780 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65  ional locking be
2e790 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a  havior, where.**
2e7a0 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65   opening a conne
2e7b0 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62  ction to a datab
2e7c0 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  ase file does no
2e7d0 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e  t take a lock on
2e7e0 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72   it..** The shar
2e7f0 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f  ed lock and an o
2e800 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
2e810 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e  tor are maintain
2e820 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65  ed until .** the
2e830 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
2e840 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
2e850 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  losed. .**.** Th
2e860 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64  e proxy file and
2e870 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
2e880 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64  re never deleted
2e890 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65   so they only ne
2e8a0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61  ed.** to be crea
2e8b0 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69  ted the first ti
2e8c0 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64  me they are used
2e8d0 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ..**.** Configur
2e8e0 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a  ation options.**
2e8f0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
2e900 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51  ------.**.**  SQ
2e910 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2e920 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20  Y_LOCKING.**.** 
2e930 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66        Database f
2e940 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e  iles accessed on
2e950 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20   non-local file 
2e960 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20  systems are.**  
2e970 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c       automatical
2e980 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ly configured fo
2e990 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c  r proxy locking,
2e9a0 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a   lock files are.
2e9b0 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61  **       named a
2e9c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69  utomatically usi
2e9d0 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  ng the same logi
2e9e0 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52  c as.**       PR
2e9f0 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f  AGMA lock_proxy_
2ea00 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a  file=":auto:".**
2ea10 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f      .**  SQLITE_
2ea20 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a  PROXY_DEBUG.**.*
2ea30 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20  *       Enables 
2ea40 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65  the logging of e
2ea50 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75  rror messages du
2ea60 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c  ring host id fil
2ea70 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69  e.**       retri
2ea80 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f  eval and creatio
2ea90 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f  n.**.**  LOCKPRO
2eaa0 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20  XYDIR.**.**     
2eab0 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20    Overrides the 
2eac0 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72  default director
2ead0 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20  y used for lock 
2eae0 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74  proxy files that
2eaf0 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61  .**       are na
2eb00 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
2eb10 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f  y via the ":auto
2eb20 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a  :" setting.**.**
2eb30 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
2eb40 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
2eb50 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20  SIONS.**.**     
2eb60 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f    Permissions to
2eb70 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69   use when creati
2eb80 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66  ng a directory f
2eb90 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a  or storing the.*
2eba0 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f  *       lock pro
2ebb0 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75  xy files, only u
2ebc0 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f  sed when LOCKPRO
2ebd0 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74  XYDIR is not set
2ebe0 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a  ..**    .**    .
2ebf0 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20  ** As mentioned 
2ec00 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70  above, when comp
2ec10 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
2ec20 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2ec30 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e  CKING,.** settin
2ec40 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  g the environmen
2ec50 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54  t variable SQLIT
2ec60 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2ec70 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a  CKING to 1 will.
2ec80 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c  ** force proxy l
2ec90 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65  ocking to be use
2eca0 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  d for every data
2ecb0 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  base file opened
2ecc0 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20  , and 0.** will 
2ecd0 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20  force automatic 
2ece0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
2ecf0 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72   be disabled for
2ed00 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
2ed10 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74   files (explicit
2ed20 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51  y calling the SQ
2ed30 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
2ed40 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
2ed50 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
2ed60 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
2ed70 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
2ed80 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2ed90 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
2eda0 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
2edb0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
2edc0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
2edd0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
2ede0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2edf0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2ee00 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
2ee10 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
2ee20 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
2ee30 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
2ee40 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
2ee50 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
2ee60 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
2ee70 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
2ee80 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
2ee90 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
2eea0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2eeb0 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
2eec0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
2eed0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
2eee0 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
2eef0 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
2ef00 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
2ef10 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
2ef20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2ef30 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
2ef40 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
2ef50 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
2ef60 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
2ef70 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
2ef80 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
2ef90 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
2efa0 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
2efb0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
2efc0 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
2efd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2efe0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
2eff0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
2f000 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
2f010 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
2f020 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
2f030 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
2f040 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c   */.  void *oldL
2f050 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
2f060 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
2f070 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f  ockingcontext to
2f080 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73   restore on clos
2f090 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
2f0a0 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
2f0b0 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20  *pOldMethod;    
2f0c0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f   /* Original I/O
2f0d0 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f   methods for clo
2f0e0 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a  se */.};../* .**
2f0f0 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   The proxy lock 
2f100 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68  file path for th
2f110 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62  e database at db
2f120 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  Path is written 
2f130 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20  into lPath, .** 
2f140 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74  which must point
2f150 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61   to valid, writa
2f160 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65  ble memory large
2f170 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61   enough for a ma
2f180 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66  xLen length.** f
2f190 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74  ile path. .*/.st
2f1a0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
2f1b0 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  tLockPath(const 
2f1c0 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
2f1d0 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f  ar *lPath, size_
2f1e0 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74  t maxLen){.  int
2f1f0 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65   len;.  int dbLe
2f200 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66  n;.  int i;..#if
2f210 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  def LOCKPROXYDIR
2f220 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
2f230 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58  (lPath, LOCKPROX
2f240 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  YDIR, maxLen);.#
2f250 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53  else.# ifdef _CS
2f260 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2f270 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66  P_DIR.  {.    if
2f280 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ( !confstr(_CS_D
2f290 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
2f2a0 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c  DIR, lPath, maxL
2f2b0 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  en) ){.      OST
2f2c0 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41  RACE(("GETLOCKPA
2f2d0 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72  TH  failed %s er
2f2e0 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22  rno=%d pid=%d\n"
2f2f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f300 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67   lPath, errno, g
2f310 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20  etpid()));.     
2f320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2f330 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  OERR_LOCK;.    }
2f340 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
2f350 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74  at(lPath, "sqlit
2f360 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e  eplocks", maxLen
2f370 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73  );    .  }.# els
2f380 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  e.  len = strlcp
2f390 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22  y(lPath, "/tmp/"
2f3a0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64  , maxLen);.# end
2f3b0 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  if.#endif..  if(
2f3c0 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27   lPath[len-1]!='
2f3d0 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  /' ){.    len = 
2f3e0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
2f3f0 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d  /", maxLen);.  }
2f400 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f  .  .  /* transfo
2f410 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74  rm the db path t
2f420 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65  o a unique cache
2f430 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e   name */.  dbLen
2f440 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
2f450 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69  bPath);.  for( i
2f460 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28  =0; i<dbLen && (
2f470 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61  i+len+7)<(int)ma
2f480 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xLen; i++){.    
2f490 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b  char c = dbPath[
2f4a0 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b  i];.    lPath[i+
2f4b0 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f  len] = (c=='/')?
2f4c0 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61  '_':c;.  }.  lPa
2f4d0 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a  th[i+len]='\0';.
2f4e0 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c    strlcat(lPath,
2f4f0 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65   ":auto:", maxLe
2f500 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  n);.  OSTRACE(("
2f510 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  GETLOCKPATH  pro
2f520 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
2f530 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68  pid=%d\n", lPath
2f540 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
2f550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f560 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65  ;.}../* . ** Cre
2f570 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69  ates the lock fi
2f580 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69  le and any missi
2f590 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69  ng directories i
2f5a0 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73  n lockPath. */.s
2f5b0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2f5c0 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f  reateLockPath(co
2f5d0 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  nst char *lockPa
2f5e0 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65  th){.  int i, le
2f5f0 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41  n;.  char buf[MA
2f600 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74  XPATHLEN];.  int
2f610 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20   start = 0;.  . 
2f620 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68   assert(lockPath
2f630 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72  !=NULL);.  /* tr
2f640 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20  y to create all 
2f650 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
2f660 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a   directories */.
2f670 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72    len = (int)str
2f680 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  len(lockPath);. 
2f690 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61   buf[0] = lockPa
2f6a0 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d  th[0];.  for( i=
2f6b0 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b  1; i<len; i++ ){
2f6c0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74  .    if( lockPat
2f6d0 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28  h[i] == '/' && (
2f6e0 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29  i - start > 0) )
2f6f0 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20  {.      /* only 
2f700 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69  mkdir if leaf di
2f710 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20  r != "." or "/" 
2f720 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20  or ".." */.     
2f730 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c   if( i-start>2 |
2f740 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26  | (i-start==1 &&
2f750 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
2f760 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  .' && buf[start]
2f770 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20   != '/') .      
2f780 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d     || (i-start==
2f790 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  2 && buf[start] 
2f7a0 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
2f7b0 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29  art+1] != '.') )
2f7c0 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d  {.        buf[i]
2f7d0 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\0';.        i
2f7e0 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20  f( osMkdir(buf, 
2f7f0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2f800 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
2f810 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
2f820 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
2f830 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2f840 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
2f850 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
2f860 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
2f870 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
2f880 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
2f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8a0 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
2f8b0 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2f8c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2f8d0 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
2f8e0 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
2f8f0 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  kPath, getpid())
2f900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2f910 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20  eturn err;.     
2f920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2f940 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a  tart=i+1;.    }.
2f950 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63      buf[i] = loc
2f960 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20  kPath[i];.  }.  
2f970 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
2f980 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
2f990 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
2f9a0 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68  =%d\n", lockPath
2f9b0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
2f9c0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2f9d0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
2f9e0 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
2f9f0 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
2fa00 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
2fa10 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
2fa20 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
2fa30 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
2fa40 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
2fa50 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
2fa60 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
2fa70 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
2fa80 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
2fa90 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
2faa0 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
2fab0 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
2fac0 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
2fad0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
2fae0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
2faf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2fb00 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
2fb10 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
2fb20 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
2fb30 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
2fb40 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
2fb50 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
2fb60 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
2fb70 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
2fb80 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
2fb90 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
2fba0 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
2fbb0 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
2fbc0 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
2fbd0 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
2fbe0 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
2fbf0 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65  = -1;.  unixFile
2fc00 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
2fc10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2fc20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
2fc30 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
2fc40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
2fc50 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20  dummyVfs;.  int 
2fc60 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e  terrno = 0;.  Un
2fc70 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2fc80 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f  sed = NULL;..  /
2fc90 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74  * 1. first try t
2fca0 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
2fcb0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69  e file.  ** 2. i
2fcc0 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e  f that fails, an
2fcd0 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b  d this is a lock
2fce0 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68   file (not-conch
2fcf0 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a  ), try creating.
2fd00 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20    ** the parent 
2fd10 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20  directories and 
2fd20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a  then try again..
2fd30 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20    ** 3. if that 
2fd40 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70  fails, try to op
2fd50 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64  en the file read
2fd60 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72  -only.  ** other
2fd70 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59  wise return BUSY
2fd80 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20   (if lock file) 
2fd90 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20  or CANTOPEN for 
2fda0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20  the conch file. 
2fdb0 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20   */.  pUnused = 
2fdc0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70  findReusableFd(p
2fdd0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b  ath, openFlags);
2fde0 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29  .  if( pUnused )
2fdf0 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73  {.    fd = pUnus
2fe00 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b  ed->fd;.  }else{
2fe10 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73  .    pUnused = s
2fe20 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
2fe30 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
2fe40 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65  .    if( !pUnuse
2fe50 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
2fe60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2fe70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2fe80 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d  fd<0 ){.    fd =
2fe90 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
2fea0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2feb0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2fec0 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2fed0 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
2fee0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  no;.    if( fd<0
2fef0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e   && errno==ENOEN
2ff00 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20  T && islockfile 
2ff10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f  ){.      if( pro
2ff20 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
2ff30 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45  (path) == SQLITE
2ff40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66  _OK ){.        f
2ff50 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
2ff60 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
2ff70 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ff80 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
2ff90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ffa0 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
2ffb0 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  ){.    openFlags
2ffc0 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
2ffd0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2ffe0 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
2fff0 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  s, SQLITE_DEFAUL
30000 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
30010 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20  NS);.    terrno 
30020 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69  = errno;.  }.  i
30030 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69  f( fd<0 ){.    i
30040 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b  f( islockfile ){
30050 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
30060 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
30070 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72  .    switch (ter
30080 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73  rno) {.      cas
30090 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20  e EACCES:.      
300a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
300b0 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65  PERM;.      case
300c0 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72   EIO: .        r
300d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
300e0 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e  RR_LOCK; /* even
300f0 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68   though it is th
30100 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20  e conch */.     
30110 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
30120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30130 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
30140 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e     }.  }.  .  pN
30150 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
30160 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
30170 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
30180 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c    if( pNew==NULL
30190 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
301a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
301b0 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70  oto end_create_p
301c0 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  roxy;.  }.  mems
301d0 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
301e0 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
301f0 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73   pNew->openFlags
30200 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
30210 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73  memset(&dummyVfs
30220 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d  , 0, sizeof(dumm
30230 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56  yVfs));.  dummyV
30240 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76  fs.pAppData = (v
30250 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
30260 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56  Finder;.  dummyV
30270 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d  fs.zName = "dumm
30280 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  y";.  pUnused->f
30290 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65  d = fd;.  pUnuse
302a0 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46  d->flags = openF
302b0 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55  lags;.  pNew->pU
302c0 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
302d0 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
302e0 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79  nUnixFile(&dummy
302f0 56 66 73 2c 20 66 64 2c 20 30 2c 20 28 73 71 6c  Vfs, fd, 0, (sql
30300 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
30310 20 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b   path, 0, 0, 0);
30320 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46  E_OK ){.    *ppF
30340 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ile = pNew;.    
30350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30360 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65  ;.  }.end_create
30370 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f  _proxy:    .  ro
30380 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
30390 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
303a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
303b0 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  New);.  sqlite3_
303c0 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
303d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
303e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
303f0 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
30400 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
30410 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
30420 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
30430 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
30440 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
30450 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
30460 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
30470 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68      16  /* conch
30480 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65   file host id le
30490 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20  ngth */../* Not 
304a0 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69  always defined i
304b0 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73  n the headers as
304c0 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
304d0 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65  */.extern int ge
304e0 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74  thostuuid(uuid_t
304f0 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63   id, const struc
30500 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74  t timespec *wait
30510 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68  );../* get the h
30520 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f  ost ID via getho
30530 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49  stuuid(), pHostI
30540 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  D must point to 
30550 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
30560 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69  .** bytes of wri
30570 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  table memory..*/
30580 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
30590 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67  yGetHostID(unsig
305a0 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49  ned char *pHostI
305b0 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b  D, int *pError){
305c0 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f  .  assert(PROXY_
305d0 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a  HOSTIDLEN == siz
305e0 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20  eof(uuid_t));.  
305f0 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20  memset(pHostID, 
30600 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  0, PROXY_HOSTIDL
30610 45 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  EN);.#if defined
30620 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53  (__MAX_OS_X_VERS
30630 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
30640 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
30650 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f    && __MAC_OS_X_
30660 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55  VERSION_MIN_REQU
30670 49 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20  IRED<1050.  {.  
30680 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
30690 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74  truct timespec t
306a0 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b  imeout = {1, 0};
306b0 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75   /* 1 sec timeou
306c0 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74  t */.    if( get
306d0 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
306e0 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
306f0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
30700 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
30710 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
30720 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b    *pError = err;
30730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
30740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30750 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
30760 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
30770 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a  AMETER(pError);.
30780 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
30790 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73  LITE_TEST.  /* s
307a0 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
307b0 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
307c0 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
307d0 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20   file paths */. 
307e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73   if( sqlite3_hos
307f0 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20  tid_num != 0){. 
30800 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20     pHostID[0] = 
30810 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30  (char)(pHostID[0
30820 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74  ] + (char)(sqlit
30830 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20  e3_hostid_num & 
30840 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  0xFF));.  }.#end
30850 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53  if.  .  return S
30860 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
30870 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  The conch file c
30880 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64  ontains the head
30890 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20  er, host id and 
308a0 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20  lock file path. 
308b0 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
308c0 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20  _CONCHVERSION 2 
308d0 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64    /* 1-byte head
308e0 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74  er, 16-byte host
308f0 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65   id, path */.#de
30900 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45  fine PROXY_HEADE
30910 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63  RLEN    1   /* c
30920 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72  onch file header
30930 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69   length */.#defi
30940 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  ne PROXY_PATHIND
30950 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41  EX    (PROXY_HEA
30960 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
30970 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20  TIDLEN).#define 
30980 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
30990 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52  N  (PROXY_HEADER
309a0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
309b0 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a  LEN+MAXPATHLEN).
309c0 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ./* .** Takes an
309d0 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   open conch file
309e0 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e  , copies the con
309f0 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70  tents to a new p
30a00 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76  ath and then mov
30a10 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20  es .** it back. 
30a20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74   The newly creat
30a30 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64  ed file's file d
30a40 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73  escriptor is ass
30a50 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  igned to the.** 
30a60 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63  conch file struc
30a70 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79  ture and finally
30a80 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
30a90 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  nch file descrip
30aa0 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65  tor is .** close
30ab0 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f  d.  Returns zero
30ac0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
30ad0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
30ae0 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
30af0 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
30b00 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
30b10 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  ID){.  proxyLock
30b20 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
30b30 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
30b40 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
30b50 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
30b60 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f   .  unixFile *co
30b70 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
30b80 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61  conchFile;.  cha
30b90 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  r tPath[MAXPATHL
30ba0 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  EN];.  char buf[
30bb0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
30bc0 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74  N];.  char *cPat
30bd0 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h = pCtx->conchF
30be0 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f  ilePath;.  size_
30bf0 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
30c00 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20   size_t pathLen 
30c10 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d  = 0;.  char errm
30c20 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69  sg[64] = "";.  i
30c30 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e  nt fd = -1;.  in
30c40 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55  t rc = -1;.  UNU
30c50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79  SED_PARAMETER(my
30c60 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63  HostID);..  /* c
30c70 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68  reate a new path
30c80 20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20   by replace the 
30c90 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68  trailing '-conch
30ca0 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20  ' with '-break' 
30cb0 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73  */.  pathLen = s
30cc0 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50  trlcpy(tPath, cP
30cd0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
30ce0 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e  ;.  if( pathLen>
30cf0 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61  MAXPATHLEN || pa
30d00 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20  thLen<6 || .    
30d10 20 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68   (strlcpy(&tPath
30d20 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72  [pathLen-5], "br
30d30 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29  eak", 6) != 5) )
30d40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
30d50 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
30d60 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61  rmsg),errmsg,"pa
30d70 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  th error (len %d
30d80 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29  )",(int)pathLen)
30d90 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
30da0 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
30db0 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63  /* read the conc
30dc0 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72  h content */.  r
30dd0 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64  eadLen = osPread
30de0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62  (conchFile->h, b
30df0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
30e00 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28  CHLEN, 0);.  if(
30e10 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50   readLen<PROXY_P
30e20 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20  ATHINDEX ){.    
30e30 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30e40 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
30e50 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72  errmsg,"read err
30e60 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e  or (len %d)",(in
30e70 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20  t)readLen);.    
30e80 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
30e90 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69  ck;.  }.  /* wri
30ea0 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
30eb0 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b   temporary break
30ec0 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20   file */.  fd = 
30ed0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74  robust_open(tPat
30ee0 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  h, (O_RDWR|O_CRE
30ef0 41 54 7c 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20  AT|O_EXCL),.    
30f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
30f10 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
30f20 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
30f30 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
30f40 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30f50 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
30f60 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65  g), errmsg, "cre
30f70 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ate failed (%d)"
30f80 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
30f90 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
30fa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77  ;.  }.  if( osPw
30fb0 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65  rite(fd, buf, re
30fc0 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73  adLen, 0) != (ss
30fd0 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b  ize_t)readLen ){
30fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
30ff0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
31000 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77  msg), errmsg, "w
31010 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  rite failed (%d)
31020 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
31030 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
31040 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e  k;.  }.  if( ren
31050 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68  ame(tPath, cPath
31060 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
31070 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
31080 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
31090 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64  , "rename failed
310a0 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
310b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
310c0 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  aklock;.  }.  rc
310d0 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28   = 0;.  fprintf(
310e0 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73  stderr, "broke s
310f0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c  tale lock on %s\
31100 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f  n", cPath);.  ro
31110 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
31120 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  , conchFile->h, 
31130 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e  __LINE__);.  con
31140 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a  chFile->h = fd;.
31150 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65    conchFile->ope
31160 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
31170 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f  | O_CREAT;..end_
31180 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28  breaklock:.  if(
31190 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66   rc ){.    if( f
311a0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  d>=0 ){.      os
311b0 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20  Unlink(tPath);. 
311c0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
311d0 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c  e(pFile, fd, __L
311e0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
311f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
31200 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65  , "failed to bre
31210 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ak stale lock on
31220 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74   %s, %s\n", cPat
31230 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  h, errmsg);.  }.
31240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31250 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75  /* Take the requ
31260 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  ested lock on th
31270 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64  e conch file and
31280 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c   break a stale l
31290 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  ock if the .** h
312a0 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a  ost id matches..
312b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
312c0 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  oxyConchLock(uni
312d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
312e0 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69  id_t myHostID, i
312f0 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20  nt lockType){.  
31300 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31310 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
31320 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31330 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
31340 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
31350 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
31360 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
31370 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
31380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
31390 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74  nTries = 0;.  st
313a0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f  ruct timespec co
313b0 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20  nchModTime;.  . 
313c0 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f   memset(&conchMo
313d0 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66  dTime, 0, sizeof
313e0 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b  (conchModTime));
313f0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
31400 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
31410 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
31420 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
31430 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
31440 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20      nTries ++;. 
31450 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31460 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
31470 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66  /* If the lock f
31480 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20  ailed (busy):.  
31490 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20       * 1st try: 
314a0 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  get the mod time
314b0 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77   of the conch, w
314c0 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79  ait 0.5s and try
314d0 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20   again. .       
314e0 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20  * 2nd try: fail 
314f0 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  if the mod time 
31500 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20  changed or host 
31510 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c  id is different,
31520 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20   wait .       * 
31530 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63            10 sec
31540 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20   and try again. 
31550 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a        * 3rd try:
31560 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
31570 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74  unless the mod t
31580 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ime has changed.
31590 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
315a0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
315b0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
315c0 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  tat(conchFile->h
315d0 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20  , &buf) ){.     
315e0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
315f0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
31600 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31610 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
31620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
31630 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
31640 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
31650 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
31660 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
31670 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
31680 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
31690 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
316a0 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
316b0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
316c0 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
316d0 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
316e0 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >1 );.      if( 
316f0 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
31700 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
31710 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c  imespec.tv_sec |
31720 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63  | .         conc
31730 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63  hModTime.tv_nsec
31740 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
31750 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a  spec.tv_nsec ){.
31760 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31770 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
31780 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
31790 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29   if( nTries==2 )
317a0 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72  {  .        char
317b0 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43   tBuf[PROXY_MAXC
317c0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
317d0 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72    int len = osPr
317e0 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
317f0 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  , tBuf, PROXY_MA
31800 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
31810 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30         if( len<0
31820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
31830 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
31840 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
31850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31860 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
31870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
31880 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48  ( len>PROXY_PATH
31890 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d  INDEX && tBuf[0]
318a0 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  ==(char)PROXY_CO
318b0 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20  NCHVERSION){.   
318c0 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
318d0 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69  break the lock i
318e0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f  f the host id do
318f0 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  esn't match */. 
31900 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d           if( 0!=
31910 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f  memcmp(&tBuf[PRO
31920 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
31930 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
31940 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20  OSTIDLEN) ){.   
31950 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
31960 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
31970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31990 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
319a0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f   the lock on sho
319b0 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72  rt read or a ver
319c0 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f  sion mismatch */
319d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
319e0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
319f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31a00 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30   usleep(10000000
31a10 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65  ); /* wait 10 se
31a20 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
31a30 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ck again */.    
31a40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20      continue; . 
31a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
31a60 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
31a70 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69  es==3 );.      i
31a80 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b  f( 0==proxyBreak
31a90 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
31aa0 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20   myHostID) ){.  
31ab0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31ac0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
31ad0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c  ( lockType==EXCL
31ae0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
31af0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
31b00 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
31b10 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
31b20 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
31b30 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20   SHARED_LOCK);  
31b40 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
31b50 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
31b60 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
31b70 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
31b80 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
31b90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
31ba0 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
31bb0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
31bc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
31bd0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
31be0 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73  E_BUSY && nTries
31bf0 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  <3 );.  .  retur
31c00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
31c10 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
31c20 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
31c30 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
31c40 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
31c50 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
31c60 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
31c70 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
31c80 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
31c90 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
31ca0 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
31cb0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
31cc0 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
31cd0 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
31ce0 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
31cf0 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
31d00 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
31d10 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
31d20 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
31d30 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
31d40 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
31d50 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
31d60 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
31d70 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
31d80 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
31d90 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
31da0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
31db0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
31dc0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
31dd0 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
31de0 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b  >conchHeld!=0 ){
31df0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31e00 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
31e10 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
31e20 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
31e30 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75  conchFile;.    u
31e40 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a  uid_t myHostID;.
31e50 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d      int pError =
31e60 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61   0;.    char rea
31e70 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  dBuf[PROXY_MAXCO
31e80 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
31e90 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41  r lockPath[MAXPA
31ea0 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  THLEN];.    char
31eb0 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d   *tempLockPath =
31ec0 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
31ed0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31ee0 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e     int createCon
31ef0 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
31f00 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b  hostIdMatch = 0;
31f10 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e  .    int readLen
31f20 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72   = 0;.    int tr
31f30 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
31f40 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e  ;.    int forceN
31f50 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ewLockPath = 0;.
31f60 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45      .    OSTRACE
31f70 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
31f80 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
31f90 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
31fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
31fb0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
31fc0 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
31fd0 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
31fe0 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29  o:"), getpid()))
31ff0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ;..    rc = prox
32000 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73  yGetHostID(myHos
32010 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20  tID, &pError);. 
32020 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
32030 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
32040 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
32050 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f  astErrno = pErro
32060 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  r;.      goto en
32070 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
32080 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78   }.    rc = prox
32090 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  yConchLock(pFile
320a0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52  , myHostID, SHAR
320b0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
320c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
320d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
320e0 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
320f0 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74   }.    /* read t
32100 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63  he existing conc
32110 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65  h file */.    re
32120 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52  adLen = seekAndR
32130 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63  ead((unixFile*)c
32140 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61  onchFile, 0, rea
32150 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  dBuf, PROXY_MAXC
32160 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66  ONCHLEN);.    if
32170 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20  ( readLen<0 ){. 
32180 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f       /* I/O erro
32190 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  r: lastErrno set
321a0 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
321b0 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  */.      pFile->
321c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63  lastErrno = conc
321d0 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  hFile->lastErrno
321e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
321f0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
32200 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
32210 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65  akeconch;.    }e
32220 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c  lse if( readLen<
32230 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  =(PROXY_HEADERLE
32240 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
32250 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  N) || .         
32260 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d      readBuf[0]!=
32270 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
32280 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20  HVERSION ){.    
32290 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61    /* a short rea
322a0 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72  d or version for
322b0 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61  mat mismatch mea
322c0 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  ns we need to cr
322d0 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20  eate a new .    
322e0 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e    ** conch file.
322f0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
32300 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31   createConch = 1
32310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69  ;.    }.    /* i
32320 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
32330 74 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f  tches and the lo
32340 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20  ck path already 
32350 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f  exists in the co
32360 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c  nch.    ** we'll
32370 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
32380 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77  path there, if w
32390 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61  e can't open tha
323a0 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20  t path, we'll . 
323b0 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68     ** retry with
323c0 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65   a new auto-gene
323d0 72 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20  rated path .    
323e0 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69  */.    do { /* i
323f0 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
32400 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20  o try again for 
32410 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20  an :auto: named 
32420 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  lock file */..  
32430 20 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43      if( !createC
32440 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65  onch && !forceNe
32450 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  wLockPath ){.   
32460 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68       hostIdMatch
32470 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64   = !memcmp(&read
32480 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
32490 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
324a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
324b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324c0 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c     PROXY_HOSTIDL
324d0 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  EN);.        /* 
324e0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73  if the conch has
324f0 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68   data compare th
32500 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  e contents */.  
32510 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
32520 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
32530 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66  {.          /* f
32540 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f  or auto-named lo
32550 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a  cal lock file, j
32560 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f  ust check the ho
32570 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a  st ID and we'll.
32580 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
32590 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
325a0 20 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27   file path that'
325b0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
325c0 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  re.           */
325d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68  .          if( h
325e0 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20  ostIdMatch ){.  
325f0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74            size_t
32600 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64   pathLen = (read
32610 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48  Len - PROXY_PATH
32620 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20  INDEX);.        
32630 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
32640 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41   if( pathLen>=MA
32650 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20  XPATHLEN ){.    
32660 20 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65            pathLe
32670 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a  n=MAXPATHLEN-1;.
32680 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
32690 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
326a0 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64  (lockPath, &read
326b0 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
326c0 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a  DEX], pathLen);.
326d0 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
326e0 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20  Path[pathLen] = 
326f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  0;.            t
32700 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f  empLockPath = lo
32710 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  ckPath;.        
32720 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61      tryOldLockPa
32730 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
32740 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
32750 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
32760 20 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e   path if the con
32770 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
32780 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
32790 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
327a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
327b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73     }else if( hos
327c0 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20  tIdMatch.       
327d0 20 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e          && !strn
327e0 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  cmp(pCtx->lockPr
327f0 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75  oxyPath, &readBu
32800 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
32810 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X],.            
32820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
32830 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54  eadLen-PROXY_PAT
32840 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20  HINDEX).        
32850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
32860 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c  conch host and l
32870 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a  ock path match *
32880 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
32890 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20   end_takeconch; 
328a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
328b0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
328c0 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  /* if the conch 
328d0 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61  isn't writable a
328e0 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  nd doesn't match
328f0 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20  , we can't take 
32900 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  it */.      if( 
32910 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e  (conchFile->open
32920 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
32930 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   0 ){.        rc
32940 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
32950 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32960 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
32970 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
32980 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63   /* either the c
32990 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63  onch didn't matc
329a0 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20  h or we need to 
329b0 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
329c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
329d0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
329e0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  th ){.        pr
329f0 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70  oxyGetLockPath(p
32a00 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63  Ctx->dbPath, loc
32a10 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  kPath, MAXPATHLE
32a20 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  N);.        temp
32a30 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
32a40 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ath;.        /* 
32a50 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
32a60 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f   the lock path _
32a70 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e  only_ if the con
32a80 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
32a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
32aa0 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f      /* update co
32ab0 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e  nch with host an
32ac0 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c  d path (this wil
32ad0 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20  l fail if other 
32ae0 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a  process.      **
32af0 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f   has a shared lo
32b00 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20  ck already), if 
32b10 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
32b20 68 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67  hes, use the big
32b30 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e  .      ** stick.
32b40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32b50 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c  futimes(conchFil
32b60 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  e->h, NULL);.   
32b70 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
32b80 63 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e  ch && !createCon
32b90 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ch ){.        if
32ba0 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e  ( conchFile->pIn
32bb0 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65  ode && conchFile
32bc0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
32bd0 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>1 ){.         
32be0 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
32bf0 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
32c00 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
32c10 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
32c20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  is.           **
32c30 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
32c40 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
32c50 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
32c60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32c70 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
32c80 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20       } else {   
32c90 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
32ca0 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
32cb0 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
32cc0 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45  ostID, EXCLUSIVE
32cd0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
32ce0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
32cf0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
32d00 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
32d10 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
32d20 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
32d30 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
32d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32d50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32d60 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
32d70 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f   writeBuffer[PRO
32d80 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
32d90 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69  .        int wri
32da0 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  teSize = 0;.    
32db0 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69      .        wri
32dc0 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63  teBuffer[0] = (c
32dd0 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
32de0 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  ERSION;.        
32df0 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66  memcpy(&writeBuf
32e00 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  fer[PROXY_HEADER
32e10 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
32e20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
32e30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
32e40 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
32e50 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  h!=NULL ){.     
32e60 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
32e70 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
32e80 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78  PATHINDEX], pCtx
32e90 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
32ea0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
32eb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32ec0 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
32ed0 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
32ee0 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65  Y_PATHINDEX], te
32ef0 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  mpLockPath, MAXP
32f00 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
32f10 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65   }.        write
32f20 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54  Size = PROXY_PAT
32f30 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28  HINDEX + strlen(
32f40 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
32f50 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a  XY_PATHINDEX]);.
32f60 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 66          robust_f
32f70 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69  truncate(conchFi
32f80 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65  le->h, writeSize
32f90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32fa0 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74  unixWrite((sqlit
32fb0 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46  e3_file *)conchF
32fc0 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72  ile, writeBuffer
32fd0 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b  , writeSize, 0);
32fe0 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63  .        fsync(c
32ff0 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  onchFile->h);.  
33000 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
33010 72 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e  reated a new con
33020 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73  ch file (not jus
33030 74 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f  t updated the co
33040 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20  ntents of a .   
33050 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63        ** valid c
33060 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20  onch file), try 
33070 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72  to match the per
33080 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  missions of the 
33090 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
330a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
330b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
330c0 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29  && createConch )
330d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
330e0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
330f0 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
33100 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
33110 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20  h, &buf);.      
33120 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
33130 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f  {.            mo
33140 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66  de_t cmode = buf
33150 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53  .st_mode&(S_IRUS
33160 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52  R|S_IWUSR | S_IR
33170 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20  GRP|S_IWGRP |.  
33180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331a0 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f        S_IROTH|S_
331b0 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20  IWOTH);.        
331c0 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61      /* try to ma
331d0 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65  tch the database
331e0 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73   file R/W permis
331f0 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61  sions, ignore fa
33200 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66  ilure */.#ifndef
33210 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
33220 42 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20  BUG.            
33230 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69  osFchmod(conchFi
33240 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23  le->h, cmode);.#
33250 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
33260 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20   do{.           
33270 20 20 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64     rc = osFchmod
33280 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
33290 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
332a0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28     }while( rc==(
332b0 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  -1) && errno==EI
332c0 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20  NTR );.         
332d0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
332e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
332f0 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
33300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70                fp
33310 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
33320 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20  chmod %o FAILED 
33330 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20  with %d %s\n",. 
33340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33350 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65       cmode, code
33360 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
33370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
33380 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
33390 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
333a0 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
333b0 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f   SUCCEDED\n",cmo
333c0 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de);.           
333d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
333e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
333f0 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
33400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
33410 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
33420 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77  TAT FAILED[%d] w
33430 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20  ith %d %s\n", . 
33440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33450 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74     err, code, st
33460 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23  rerror(code));.#
33470 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
33480 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
33490 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46    }.      conchF
334a0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
334b0 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
334c0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
334d0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
334e0 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b      .    end_tak
334f0 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53  econch:.      OS
33500 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
33510 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22  XY: CLOSE  %d\n"
33520 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
33530 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33540 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
33550 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20  openFlags ){.   
33560 20 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20       int fd;.   
33570 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
33580 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
33590 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
335a0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
335b0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
335c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69     }.        pFi
335d0 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  le->h = -1;.    
335e0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
335f0 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74  open(pCtx->dbPat
33600 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  h, pFile->openFl
33610 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
33620 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
33630 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
33640 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
33650 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
33660 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20  RANSPROXY: OPEN 
33670 20 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20   %d\n", fd));.  
33680 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20        if( fd>=0 
33690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
336a0 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20  le->h = fd;.    
336b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
336c0 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43       rc=SQLITE_C
336d0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a  ANTOPEN_BKPT; /*
336e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72   SQLITE_BUSY? pr
336f0 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c  oxyTakeConch cal
33700 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 64  led.           d
33710 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f  uring locking */
33720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33730 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
33740 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
33750 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29  Ctx->lockProxy )
33760 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
33770 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50  path = tempLockP
33780 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61  ath ? tempLockPa
33790 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th : pCtx->lockP
337a0 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
337b0 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61    rc = proxyCrea
337c0 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c  teUnixFile(path,
337d0 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   &pCtx->lockProx
337e0 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  y, 1);.        i
337f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33800 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
33810 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f  OMEM && tryOldLo
33820 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
33830 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e      /* we couldn
33840 27 74 20 63 72 65 61 74 65 20 74 68 65 20 70 72  't create the pr
33850 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69  oxy lock file wi
33860 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20  th the old lock 
33870 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20  file path.      
33880 20 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61       ** so try a
33890 67 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61  gain via auto-na
338a0 6d 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20  ming .          
338b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
338c0 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d  rceNewLockPath =
338d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72   1;.          tr
338e0 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
338f0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
33900 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b  inue; /* go back
33910 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68   to the do {} wh
33920 69 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c  ile start point,
33930 20 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20   try again */.  
33940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33950 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33970 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
33980 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74  ke a copy of pat
33990 68 20 69 66 20 77 65 20 65 78 74 72 61 63 74 65  h if we extracte
339a0 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  d the value.    
339b0 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
339c0 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74   conch file or t
339d0 68 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f  he path was allo
339e0 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61  cated on the sta
339f0 63 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ck.         */. 
33a00 20 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c         if( tempL
33a10 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
33a20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50       pCtx->lockP
33a30 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74  roxyPath = sqlit
33a40 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 74 65  e3DbStrDup(0, te
33a50 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20  mpLockPath);.   
33a60 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78         if( !pCtx
33a70 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
33a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
33a90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
33aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
33ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33ac0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33ad0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33ae0 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65     pCtx->conchHe
33af0 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
33b00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
33b10 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d  x->lockProxy->pM
33b20 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d  ethod == &afpIoM
33b30 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
33b40 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f      afpLockingCo
33b50 6e 74 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20  ntext *afpCtx;. 
33b60 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78 20           afpCtx 
33b70 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
33b80 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63  text *)pCtx->loc
33b90 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43  kProxy->lockingC
33ba0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
33bb0 20 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68    afpCtx->dbPath
33bc0 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
33bd0 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  xyPath;.        
33be0 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
33bf0 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69  .        conchFi
33c00 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
33c10 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
33c20 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e  le*)conchFile, N
33c30 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
33c40 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
33c50 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25  "TAKECONCH  %d %
33c60 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  s\n", conchFile-
33c70 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
33c80 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
33c90 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 29  ?"ok":"failed"))
33ca0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
33cb0 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28  c;.    } while (
33cc0 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77  1); /* in case w
33cd0 65 20 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20  e need to retry 
33ce0 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20  the :auto: lock 
33cf0 66 69 6c 65 20 2d 20 0a 20 20 20 20 20 20 20 20  file - .        
33d00 20 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 73           ** we s
33d10 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74 20  hould never get 
33d20 68 65 72 65 20 65 78 63 65 70 74 20 76 69 61 20  here except via 
33d30 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20 63  the 'continue' c
33d40 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f  all. */.  }.}../
33d50 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f  *.** If pFile ho
33d60 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  lds a lock on a 
33d70 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e  conch file, then
33d80 20 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f   release that lo
33d90 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
33da0 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  t proxyReleaseCo
33db0 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nch(unixFile *pF
33dc0 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ile){.  int rc =
33dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
33de0 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
33df0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
33e00 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
33e10 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f  ontext *pCtx;  /
33e20 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  * The locking co
33e30 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 70 72  ntext for the pr
33e40 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  oxy lock */.  un
33e50 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
33e60 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e;        /* Nam
33e70 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66  e of the conch f
33e80 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d  ile */..  pCtx =
33e90 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
33ea0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
33eb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
33ec0 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74   conchFile = pCt
33ed0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
33ee0 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53  OSTRACE(("RELEAS
33ef0 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25  ECONCH  %d for %
33f00 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e  s pid=%d\n", con
33f10 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
33f20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63        (pCtx->loc
33f30 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74  kProxyPath ? pCt
33f40 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
33f50 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20   : ":auto:"), . 
33f60 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64            getpid
33f70 28 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78  ()));.  if( pCtx
33f80 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
33f90 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
33fa0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
33fb0 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
33fc0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
33fd0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  NO_LOCK);.  }.  
33fe0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
33ff0 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  = 0;.  OSTRACE((
34000 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25  "RELEASECONCH  %
34010 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d %s\n", conchFi
34020 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
34030 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b    (rc==SQLITE_OK
34040 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
34050 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d")));.  return 
34060 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
34070 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
34080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
34090 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65  compute the name
340a0 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69   of its conch fi
340b0 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65  le..** Store the
340c0 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20   conch filename 
340d0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
340e0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
340f0 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b  malloc()..** Mak
34100 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f  e *pConchPath po
34110 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e  int to the new n
34120 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ame.  Return SQL
34130 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
34140 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  s.** or SQLITE_N
34150 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74  OMEM if unable t
34160 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e  o obtain memory.
34170 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
34180 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
34190 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
341a0 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  at the allocated
341b0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65   memory.** space
341c0 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
341d0 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f  reed..**.** *pCo
341e0 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20 74  nchPath is set t
341f0 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f  o NULL if a memo
34200 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
34210 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
34220 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
34230 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61  reateConchPathna
34240 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c  me(char *dbPath,
34250 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61   char **pConchPa
34260 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  th){.  int i;   
34270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34280 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
34290 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  nter */.  int le
342a0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
342b0 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67  dbPath); /* Leng
342c0 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  th of database f
342d0 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68  ilename - dbPath
342e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
342f0 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  hPath;          
34300 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e      /* buffer in
34310 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72   which to constr
34320 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a  uct conch name *
34330 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
34340 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63   space for the c
34350 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e  onch filename an
34360 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
34370 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68   name to.  ** th
34380 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72  e name of the or
34390 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
343a0 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43  file. */  .  *pC
343b0 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68  onchPath = conch
343c0 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73  Path = (char *)s
343d0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65  qlite3_malloc(le
343e0 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f  n + 8);.  if( co
343f0 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20  nchPath==0 ){.  
34400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34410 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
34420 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64  cpy(conchPath, d
34430 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20  bPath, len+1);. 
34440 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72   .  /* now inser
34450 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74  t a "." before t
34460 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63  he last / charac
34470 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d  ter */.  for( i=
34480 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69  (len-1); i>=0; i
34490 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  -- ){.    if( co
344a0 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20  nchPath[i]=='/' 
344b0 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
344c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
344d0 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68  .  }.  conchPath
344e0 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65  [i]='.';.  while
344f0 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20   ( i<len ){.    
34500 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64  conchPath[i+1]=d
34510 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b  bPath[i];.    i+
34520 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70  +;.  }..  /* app
34530 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22  end the "-conch"
34540 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20 66   suffix to the f
34550 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ile */.  memcpy(
34560 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c  &conchPath[i+1],
34570 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20   "-conch", 7);. 
34580 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74   assert( (int)st
34590 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20  rlen(conchPath) 
345a0 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72  == len+7 );..  r
345b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
345c0 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20  .}.../* Takes a 
345d0 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  fully configured
345e0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73   proxy locking-s
345f0 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61  tyle unix file a
34600 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74  nd switches.** t
34610 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  he local lock fi
34620 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74  le path .*/.stat
34630 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63  ic int switchLoc
34640 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46  kProxyPath(unixF
34650 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73  ile *pFile, cons
34660 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a  t char *path) {.
34670 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
34680 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
34690 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
346a0 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
346b0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61  ngContext;.  cha
346c0 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74  r *oldPath = pCt
346d0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
346e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
346f0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
34700 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
34710 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
34720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
34730 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20  SY;.  }  ..  /* 
34740 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66  nothing to do if
34750 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c   the path is NUL
34760 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74  L, :auto: or mat
34770 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e  ches the existin
34780 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20  g path */.  if( 
34790 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d  !path || path[0]
347a0 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d  =='\0' || !strcm
347b0 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  p(path, ":auto:"
347c0 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74  ) ||.    (oldPat
347d0 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c  h && !strncmp(ol
347e0 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58  dPath, path, MAX
347f0 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20  PATHLEN)) ){.   
34800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34810 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
34820 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
34830 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
34840 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d  Proxy;.    pCtx-
34850 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b  >lockProxy=NULL;
34860 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68  .    pCtx->conch
34870 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  Held = 0;.    if
34880 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c  ( lockProxy!=NUL
34890 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f  L ){.      rc=lo
348a0 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
348b0 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
348c0 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f  3_file *)lockPro
348d0 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xy);.      if( r
348e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
348f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
34900 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  e(lockProxy);.  
34910 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
34920 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20  free(oldPath);. 
34930 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
34940 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
34950 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68  DbStrDup(0, path
34960 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
34970 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
34980 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20  pFile is a file 
34990 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70  that has been op
349a0 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ened by a prior 
349b0 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50  xOpen call.  dbP
349c0 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  ath.** is a stri
349d0 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61  ng buffer at lea
349e0 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20  st MAXPATHLEN+1 
349f0 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69  characters in si
34a00 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ze..**.** This r
34a10 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20  outine find the 
34a20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61  filename associa
34a30 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61  ted with pFile a
34a40 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20  nd writes it.** 
34a50 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73  int dbPath..*/.s
34a60 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
34a70 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
34a80 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
34a90 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74  ile, char *dbPat
34aa0 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  h){.#if defined(
34ab0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28  __APPLE__).  if(
34ac0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
34ad0 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
34ae0 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73   ){.    /* afp s
34af0 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66  tyle keeps a ref
34b00 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62  erence to the db
34b10 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c   path in the fil
34b20 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20  ePath field .   
34b30 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63   ** of the struc
34b40 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
34b50 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68   (int)strlen((ch
34b60 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
34b70 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
34b80 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
34b90 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 28  rlcpy(dbPath, ((
34ba0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
34bb0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
34bc0 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61  ngContext)->dbPa
34bd0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
34be0 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  .  } else.#endif
34bf0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
34c00 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63  ethod == &dotloc
34c10 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  kIoMethods ){.  
34c20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74    /* dot lock st
34c30 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63  yle uses the loc
34c40 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20  king context to 
34c50 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f  store the dot lo
34c60 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70  ck.    ** file p
34c70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ath */.    int l
34c80 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61  en = strlen((cha
34c90 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
34ca0 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72  ngContext) - str
34cb0 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  len(DOTLOCK_SUFF
34cc0 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  IX);.    memcpy(
34cd0 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
34ce0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34cf0 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b  ntext, len + 1);
34d00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
34d10 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65   all other style
34d20 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e  s use the lockin
34d30 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
34d40 72 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 70  re the db file p
34d50 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ath */.    asser
34d60 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  t( strlen((char*
34d70 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34d80 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
34d90 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63  LEN );.    strlc
34da0 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72  py(dbPath, (char
34db0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
34dc0 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54  gContext, MAXPAT
34dd0 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  HLEN);.  }.  ret
34de0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34df0 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ../*.** Takes an
34e00 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20   already filled 
34e10 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64  in unix file and
34e20 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c   alters it so al
34e30 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a  l file locking .
34e40 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f  ** will be perfo
34e50 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61  rmed on the loca
34e60 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  l proxy lock fil
34e70 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  e.  The followin
34e80 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20  g fields.** are 
34e90 70 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65  preserved in the
34ea0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
34eb0 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
34ec0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  n be restored an
34ed0 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73  d .** the unix s
34ee0 74 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c  tructure properl
34ef0 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20  y cleaned up at 
34f00 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20  close time:.**  
34f10 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
34f20 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a  .**  ->pMethod.*
34f30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
34f40 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
34f50 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
34f60 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ile, const char 
34f70 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79  *path) {.  proxy
34f80 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34f90 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50  pCtx;.  char dbP
34fa0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31  ath[MAXPATHLEN+1
34fb0 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ];       /* Name
34fc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
34fd0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
34fe0 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a  *lockPath=NULL;.
34ff0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35000 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70  E_OK;.  .  if( p
35010 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
35020 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
35030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
35040 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47  SY;.  }.  proxyG
35050 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
35060 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74  ile(pFile, dbPat
35070 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20  h);.  if( !path 
35080 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27  || path[0]=='\0'
35090 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68   || !strcmp(path
350a0 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20  , ":auto:") ){. 
350b0 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c     lockPath=NULL
350c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
350d0 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29  ockPath=(char *)
350e0 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f  path;.  }.  .  O
350f0 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52  STRACE(("TRANSPR
35100 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73 20 70  OXY  %d for %s p
35110 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
35120 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
35130 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50  lockPath ? lockP
35140 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c  ath : ":auto:"),
35150 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
35160 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCtx = sqlite3_m
35170 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
35180 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Ctx) );.  if( pC
35190 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  tx==0 ){.    ret
351a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
351b0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
351c0 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  Ctx, 0, sizeof(*
351d0 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20  pCtx));..  rc = 
351e0 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68  proxyCreateConch
351f0 50 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c  Pathname(dbPath,
35200 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c   &pCtx->conchFil
35210 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63  ePath);.  if( rc
35220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35230 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65     rc = proxyCre
35240 61 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78  ateUnixFile(pCtx
35250 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c  ->conchFilePath,
35260 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c   &pCtx->conchFil
35270 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
35280 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
35290 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f  EN && ((pFile->o
352a0 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29  penFlags&O_RDWR)
352b0 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20   == 0) ){.      
352c0 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f 70  /* if (a) the op
352d0 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74  en flags are not
352e0 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65   O_RDWR, (b) the
352f0 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65   conch isn't the
35300 72 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  re, and.      **
35310 20 28 63 29 20 74 68 65 20 66 69 6c 65 20 73 79   (c) the file sy
35320 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c  stem is read-onl
35330 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e  y, then enable n
35340 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73  o-locking access
35350 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20  ..      ** Ugh, 
35360 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d  since O_RDONLY==
35370 30 78 30 30 30 30 20 77 65 20 74 65 73 74 20 66  0x0000 we test f
35380 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65  or !O_RDWR since
35390 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74   unixOpen assert
353a0 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
353b0 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68  openFlags will h
353c0 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20  ave only one of 
353d0 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44  O_RDONLY or O_RD
353e0 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  WR..      */.   
353f0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73     struct statfs
35400 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73   fsInfo;.      s
35410 74 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68  truct stat conch
35420 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
35430 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a  goLockless = 0;.
35440 0a 20 20 20 20 20 20 69 66 28 20 6f 73 53 74 61  .      if( osSta
35450 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  t(pCtx->conchFil
35460 65 50 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66  ePath, &conchInf
35470 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20  o) == -1 ) {.   
35480 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
35490 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
354a0 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20  ( (err==ENOENT) 
354b0 26 26 20 28 73 74 61 74 66 73 28 64 62 50 61 74  && (statfs(dbPat
354c0 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
354d0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
354e0 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73  goLockless = (fs
354f0 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
35500 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f  _RDONLY) == MNT_
35510 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  RDONLY;.        
35520 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
35530 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29  if( goLockless )
35540 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
35550 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20  conchHeld = -1; 
35560 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f  /* read only FS/
35570 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
35580 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35590 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
355a0 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72   }.  }  .  if( r
355b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
355c0 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  lockPath ){.    
355d0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
355e0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
355f0 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74  trDup(0, lockPat
35600 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  h);.  }..  if( r
35610 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35620 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
35630 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
35640 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20  up(0, dbPath);. 
35650 20 20 20 69 66 28 20 70 43 74 78 2d 3e 64 62 50     if( pCtx->dbP
35660 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ath==NULL ){.   
35670 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
35680 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
35690 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
356a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c  _OK ){.    /* al
356b0 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f  l memory is allo
356c0 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72  cated, proxys ar
356d0 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 73  e created and as
356e0 73 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20  signed, .    ** 
356f0 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69  switch the locki
35700 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70  ng context and p
35710 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75  Method then retu
35720 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  rn..    */.    p
35730 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43  Ctx->oldLockingC
35740 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e  ontext = pFile->
35750 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
35760 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69      pFile->locki
35770 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
35780 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64  ;.    pCtx->pOld
35790 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e  Method = pFile->
357a0 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46 69  pMethod;.    pFi
357b0 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70  le->pMethod = &p
357c0 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  roxyIoMethods;. 
357d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
357e0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20  pCtx->conchFile 
357f0 29 7b 20 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  ){ .      pCtx->
35800 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
35810 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
35820 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d  te3_file *)pCtx-
35830 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
35840 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
35850 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29  pCtx->conchFile)
35860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
35870 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74  te3DbFree(0, pCt
35880 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35890 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
358a0 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ree(pCtx->conchF
358b0 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73  ilePath); .    s
358c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
358d0 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
358e0 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25  (("TRANSPROXY  %
358f0 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
35900 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72  h,.           (r
35910 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
35920 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
35930 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
35940 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
35950 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73  outine handles s
35960 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
35970 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74  rol() calls that
35980 20 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a   are specific.**
35990 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   to proxy lockin
359a0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
359b0 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
359c0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
359d0 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
359e0 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *pArg){.  switc
359f0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
35a00 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
35a10 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
35a20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
35a30 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
35a40 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  )id;.      if( p
35a50 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
35a60 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
35a70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78   ){.        prox
35a80 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
35a90 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
35aa0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
35ab0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
35ac0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f  ext;.        pro
35ad0 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
35ae0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
35af0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
35b00 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
35b10 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
35b20 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f  )pArg = pCtx->lo
35b30 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20  ckProxyPath;.   
35b40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35b50 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
35b60 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61  ar **)pArg = ":a
35b70 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22  uto: (not held)"
35b80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35b90 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
35ba0 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
35bb0 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a  **)pArg = NULL;.
35bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
35bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35be0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
35bf0 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
35c00 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
35c10 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
35c20 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
35c30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
35c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
35c50 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79    int isProxySty
35c60 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65  le = (pFile->pMe
35c70 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f  thod == &proxyIo
35c80 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20  Methods);.      
35c90 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c  if( pArg==NULL |
35ca0 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  | (const char *)
35cb0 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pArg==0 ){.     
35cc0 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74     if( isProxySt
35cd0 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  yle ){.         
35ce0 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f   /* turn off pro
35cf0 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74  xy locking - not
35d00 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
35d10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
35d20 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49  ITE_ERROR /*SQLI
35d30 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c  TE_PROTOCOL? SQL
35d40 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20  ITE_MISUSE?*/;. 
35d50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
35d60 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20          /* turn 
35d70 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  off proxy lockin
35d80 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20  g - already off 
35d90 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20  - NOOP */.      
35da0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35db0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
35dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35dd0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
35de0 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73  roxyPath = (cons
35df0 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20  t char *)pArg;. 
35e00 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f         if( isPro
35e10 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20  xyStyle ){.     
35e20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e       proxyLockin
35e30 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
35e40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
35e50 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35e60 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
35e70 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
35e80 20 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70       if( !strcmp
35e90 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29  (pArg, ":auto:")
35ea0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
35eb0 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
35ec0 50 61 74 68 20 26 26 0a 20 20 20 20 20 20 20 20  Path &&.        
35ed0 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28         !strncmp(
35ee0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
35ef0 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20  ath, proxyPath, 
35f00 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20  MAXPATHLEN)).   
35f10 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
35f20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35f30 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
35f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35f50 20 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f     rc = switchLo
35f60 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c  ckProxyPath(pFil
35f70 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
35f80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35f90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35fa0 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70      /* turn on p
35fb0 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
35fc0 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  g */.          r
35fd0 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
35fe0 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65  rmUnixFile(pFile
35ff0 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
36000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36010 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36020 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
36030 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
36040 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65  rt( 0 );  /* The
36050 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68   call assures th
36060 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70  at only valid op
36070 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a  codes are sent *
36080 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  /.    }.  }.  /*
36090 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72  NOTREACHED*/.  r
360a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
360b0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74  OR;.}../*.** Wit
360c0 68 69 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f  hin this divisio
360d0 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20  n (the proxying 
360e0 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
360f0 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63  tation) the proc
36100 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20  edures.** above 
36110 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61  this point are a
36120 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54  ll utilities.  T
36130 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20  he lock-related 
36140 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a  methods of the.*
36150 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  * proxy-locking 
36160 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
36170 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e  d object follow.
36180 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .*/.../*.** This
36190 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
361a0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
361b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
361c0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
361d0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
361e0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
361f0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
36200 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
36210 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
36220 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
36230 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
36240 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
36250 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
36260 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
36270 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
36280 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
36290 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
362a0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
362b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
362c0 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
362d0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
362e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
362f0 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69  sOut) {.  unixFi
36300 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
36310 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
36320 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
36330 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
36340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36350 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
36360 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
36370 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
36380 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
36390 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
363a0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
363b0 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
363c0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
363d0 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
363e0 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 65  kProxy;.      re
363f0 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74  turn proxy->pMet
36400 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72  hod->xCheckReser
36410 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  vedLock((sqlite3
36420 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52  _file*)proxy, pR
36430 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  esOut);.    }els
36440 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20  e{ /* conchHeld 
36450 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20  < 0 is lockless 
36460 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 4f 75 74  */.      pResOut
36470 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  =0;.    }.  }.  
36480 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36490 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
364a0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
364b0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
364c0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
364d0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
364e0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
364f0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
36500 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
36510 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
36520 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
36530 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
36540 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
36550 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
36560 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
36570 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
36580 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
36590 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
365a0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
365b0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
365c0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
365d0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
365e0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
365f0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
36600 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
36610 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
36620 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
36630 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
36640 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
36650 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
36660 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
36670 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
36680 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
36690 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
366a0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
366b0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
366c0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
366d0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
366e0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
366f0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
36700 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
36710 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
36720 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
36730 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
36740 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
36750 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
36760 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
36770 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
36780 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
36790 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
367a0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
367b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
367c0 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
367d0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
367e0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
367f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
36800 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
36810 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
36820 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
36830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36840 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
36850 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
36860 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36870 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36880 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36890 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
368a0 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
368b0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
368c0 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
368d0 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
368e0 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
368f0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
36900 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
36910 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
36920 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
36930 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69  ock = proxy->eFi
36940 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  leLock;.    }els
36950 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
36960 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
36970 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
36980 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36990 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
369a0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
369b0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
369c0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
369d0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
369e0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
369f0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
36a00 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
36a10 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
36a20 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
36a30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
36a40 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
36a50 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
36a60 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
36a70 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
36a80 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
36a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
36aa0 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
36ab0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
36ac0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
36ad0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
36ae0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
36af0 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
36b00 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
36b10 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
36b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
36b30 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36b40 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
36b50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
36b60 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
36b70 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  ntext;.    if( p
36b80 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
36b90 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69   ){.      unixFi
36ba0 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
36bb0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
36bc0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70     rc = proxy->p
36bd0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
36be0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
36bf0 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29  roxy, eFileLock)
36c00 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ;.      pFile->e
36c10 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79  FileLock = proxy
36c20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
36c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
36c40 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69   conchHeld < 0 i
36c50 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  s lockless */.  
36c60 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
36c70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
36c80 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61 74 20  ose a file that 
36c90 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73  uses proxy locks
36ca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36cb0 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74  proxyClose(sqlit
36cc0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
36cd0 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
36ce0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
36cf0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
36d00 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
36d10 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
36d20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
36d30 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
36d40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
36d50 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
36d60 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  Proxy = pCtx->lo
36d70 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69  ckProxy;.    uni
36d80 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
36d90 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
36da0 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  le;.    int rc =
36db0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
36dc0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f  .    if( lockPro
36dd0 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  xy ){.      rc =
36de0 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
36df0 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
36e00 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b  lite3_file*)lock
36e10 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  Proxy, NO_LOCK);
36e20 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
36e30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36e40 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d   rc = lockProxy-
36e50 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
36e60 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
36e70 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
36e80 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
36e90 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
36ea0 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f  te3_free(lockPro
36eb0 78 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  xy);.      pCtx-
36ec0 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a  >lockProxy = 0;.
36ed0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f      }.    if( co
36ee0 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  nchFile ){.     
36ef0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
36f00 48 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  Held ){.        
36f10 72 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73  rc = proxyReleas
36f20 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
36f30 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
36f40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36f50 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f   }.      rc = co
36f60 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
36f70 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
36f80 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
36f90 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
36fa0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
36fc0 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  (conchFile);.   
36fd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
36fe0 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f  Free(0, pCtx->lo
36ff0 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  ckProxyPath);.  
37000 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
37010 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
37020 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
37030 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
37040 64 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20  dbPath);.    /* 
37050 72 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67  restore the orig
37060 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  inal locking con
37070 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64  text and pMethod
37080 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a   then close it *
37090 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  /.    pFile->loc
370a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
370b0 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
370c0 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65  ntext;.    pFile
370d0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78  ->pMethod = pCtx
370e0 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20  ->pOldMethod;.  
370f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
37100 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ctx);.    return
37110 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
37120 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d  >xClose(id);.  }
37130 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
37140 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66  _OK;.}....#endif
37150 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
37160 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
37170 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
37180 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
37190 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
371a0 20 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64   style is intend
371b0 65 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  ed for use with 
371c0 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  AFP filesystems.
371d0 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46  .** And since AF
371e0 50 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  P is only suppor
371f0 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74  ted on MacOSX, t
37200 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
37210 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74   is also.** rest
37220 72 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58  ricted to MacOSX
37230 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ..** .**.*******
37240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
37250 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
37260 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
37270 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
37280 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
37290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
372a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
372b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
372c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
372d0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
372e0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
372f0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
37300 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
37310 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
37320 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20  gisters all VFS 
37330 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
37340 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70  for unix-like op
37350 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65  erating.** syste
37360 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ms.  This routin
37370 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  e, and the sqlit
37380 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74  e3_os_end() rout
37390 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ine that follows
373a0 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74  ,.** should be t
373b0 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73  he only routines
373c0 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68   in this file th
373d0 61 74 20 61 72 65 20 76 69 73 69 62 6c 65 20 66  at are visible f
373e0 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c  rom other.** fil
373f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
37400 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
37410 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c   once during SQL
37420 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ite initializati
37430 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73  on and by a.** s
37440 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54  ingle thread.  T
37450 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
37460 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73  tion and mutex s
37470 75 62 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e  ubsystems have n
37480 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  ot.** necessaril
37490 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  y been initializ
374a0 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ed when this rou
374b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
374c0 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73  and so they.** s
374d0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65  hould not be use
374e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
374f0 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
37500 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65   .  /* .  ** The
37510 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
37520 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74   defines an init
37530 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73  ializer for an s
37540 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
37550 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65  t..  ** The name
37560 20 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e   of the VFS is N
37570 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61  AME.  The pAppDa
37580 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ta is a pointer 
37590 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a  to a pointer.  *
375a0 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72  * to the "finder
375b0 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41  " function.  (pA
375c0 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e  ppData is a poin
375d0 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ter to a pointer
375e0 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69   because.  ** si
375f0 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70 72  lly C90 rules pr
37600 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66  ohibit a void* f
37610 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74  rom being cast t
37620 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
37630 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f  nter.  ** and so
37640 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74   we have to go t
37650 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72  hrough the inter
37660 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20  mediate pointer 
37670 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
37680 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70  s.  ** when comp
37690 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61  iling with -peda
376a0 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47  ntic-errors on G
376b0 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  CC.).  **.  ** T
376c0 68 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65  he FINDER parame
376d0 74 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ter to this macr
376e0 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
376f0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
37700 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d  the.  ** finder-
37710 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66  function.  The f
37720 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72  inder-function r
37730 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
37740 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c   to the.  ** sql
37750 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  ite_io_methods o
37760 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
37770 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69 72 65  ments the desire
37780 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62  d locking.  ** b
37790 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74  ehaviors.  See t
377a0 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76  he division abov
377b0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
377c0 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20  the IOMETHODS.  
377d0 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64  ** macro for add
377e0 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ition informatio
377f0 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63  n on finder-func
37800 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
37810 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69   Most finders si
37820 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f  mply return a po
37830 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
37840 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
37850 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e  ods.  ** object.
37860 20 20 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c    But the "autol
37870 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61  ockIoFinder" ava
37880 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
37890 20 64 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20   does a little. 
378a0 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   ** more than th
378b0 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20  at; it looks at 
378c0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
378d0 79 70 65 20 74 68 61 74 20 68 6f 73 74 73 20 74  ype that hosts t
378e0 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
378f0 65 20 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73  e file and tries
37900 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f   to choose an lo
37910 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70  cking method app
37920 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a  ropriate for.  *
37930 2a 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65  * that filesyste
37940 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23  m time..  */.  #
37950 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56  define UNIXVFS(V
37960 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20  FSNAME, FINDER) 
37970 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
37980 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 33           \.    3
37990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
379a0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
379b0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
379c0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a         \.    siz
379d0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20  eof(unixFile),  
379e0 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
379f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37a00 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50       \.    MAX_P
37a10 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  ATHNAME,        
37a20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
37a30 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37a40 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20     \.    0,     
37a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37a60 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20  * pNext */      
37a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a80 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20   \.    VFSNAME, 
37a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37aa0 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  zName */        
37ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37ac0 0a 20 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e  .    (void*)&FIN
37ad0 44 45 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41  DER,       /* pA
37ae0 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20  ppData */       
37af0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37b00 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20     unixOpen,    
37b10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
37b20 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
37b30 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37b40 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
37b50 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
37b60 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37b70 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37b80 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20  nixAccess,      
37b90 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
37ba0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
37bb0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37bc0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  xFullPathname,  
37bd0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
37be0 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
37bf0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
37c00 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
37c10 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20   /* xDlOpen */  
37c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c30 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45     \.    unixDlE
37c40 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
37c50 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20  * xDlError */   
37c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c70 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d   \.    unixDlSym
37c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
37c90 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20  xDlSym */       
37ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37cb0 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65  .    unixDlClose
37cc0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
37cd0 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  lClose */       
37ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37cf0 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73     unixRandomnes
37d00 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
37d10 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20  domness */      
37d20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37d30 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20   unixSleep,     
37d40 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
37d50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37d60 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37d70 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  nixCurrentTime, 
37d80 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
37d90 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Time */         
37da0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37db0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  xGetLastError,  
37dc0 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
37dd0 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
37de0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43       \.    unixC
37df0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
37e00 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
37e10 49 6e 74 36 34 20 2a 2f 20 20 20 20 20 20 20 20  Int64 */        
37e20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 65 74     \.    unixSet
37e30 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
37e40 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xSetSystemCall
37e50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37e60 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 53 79   \.    unixGetSy
37e70 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
37e80 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
37e90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  /              \
37ea0 0a 20 20 20 20 75 6e 69 78 4e 65 78 74 53 79 73  .    unixNextSys
37eb0 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e  temCall,   /* xN
37ec0 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
37ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37ee0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c   }..  /*.  ** Al
37ef0 6c 20 64 65 66 61 75 6c 74 20 56 46 53 65 73 20  l default VFSes 
37f00 66 6f 72 20 75 6e 69 78 20 61 72 65 20 63 6f 6e  for unix are con
37f10 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66 6f  tained in the fo
37f20 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 2e 0a 20  llowing array.. 
37f30 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
37f40 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  at the sqlite3_v
37f50 66 73 2e 70 4e 65 78 74 20 66 69 65 6c 64 20 6f  fs.pNext field o
37f60 66 20 74 68 65 20 56 46 53 20 6f 62 6a 65 63 74  f the VFS object
37f70 20 69 73 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a   is modified.  *
37f80 2a 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  * by the SQLite 
37f90 63 6f 72 65 20 77 68 65 6e 20 74 68 65 20 56 46  core when the VF
37fa0 53 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e  S is registered.
37fb0 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69    So the followi
37fc0 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79 20 63 61  ng.  ** array ca
37fd0 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20  nnot be const.. 
37fe0 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 73 71 6c   */.  static sql
37ff0 69 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d 20  ite3_vfs aVfs[] 
38000 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  = {.#if SQLITE_E
38010 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
38020 59 4c 45 20 26 26 20 28 4f 53 5f 56 58 57 4f 52  YLE && (OS_VXWOR
38030 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  KS || defined(__
38040 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e  APPLE__)).    UN
38050 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20  IXVFS("unix",   
38060 20 20 20 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49         autolockI
38070 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65  oFinder ),.#else
38080 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
38090 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 70 6f  ix",          po
380a0 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  sixIoFinder ),.#
380b0 65 6e 64 69 66 0a 20 20 20 20 55 4e 49 58 56 46  endif.    UNIXVF
380c0 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20  S("unix-none",  
380d0 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65     nolockIoFinde
380e0 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
380f0 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c  ("unix-dotfile",
38100 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65    dotlockIoFinde
38110 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
38120 28 22 75 6e 69 78 2d 65 78 63 6c 22 2c 20 20 20  ("unix-excl",   
38130 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
38140 29 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ),.#if OS_VXWORK
38150 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  S.    UNIXVFS("u
38160 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73  nix-namedsem", s
38170 65 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  emIoFinder ),.#e
38180 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
38190 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
381a0 54 59 4c 45 0a 20 20 20 20 55 4e 49 58 56 46 53  TYLE.    UNIXVFS
381b0 28 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20  ("unix-posix",  
381c0 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
381d0 29 2c 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  ),.#if !OS_VXWOR
381e0 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  KS.    UNIXVFS("
381f0 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20  unix-flock",    
38200 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  flockIoFinder ),
38210 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23  .#endif.#endif.#
38220 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
38230 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
38240 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
38250 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53  E__).    UNIXVFS
38260 28 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20  ("unix-afp",    
38270 20 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c    afpIoFinder ),
38280 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
38290 69 78 2d 6e 66 73 22 2c 20 20 20 20 20 20 6e 66  ix-nfs",      nf
382a0 73 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20  sIoFinder ),.   
382b0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70   UNIXVFS("unix-p
382c0 72 6f 78 79 22 2c 20 20 20 20 70 72 6f 78 79 49  roxy",    proxyI
382d0 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
382e0 66 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65  f.  };.  unsigne
382f0 64 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20  d int i;        
38300 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
38310 72 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c  r */..  /* Doubl
38320 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  e-check that the
38330 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61   aSyscall[] arra
38340 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74  y has been const
38350 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72  ructed.  ** corr
38360 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b  ectly.  See tick
38370 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38  et [bb3a86e890c8
38380 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65  e96ab] */.  asse
38390 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53  rt( ArraySize(aS
383a0 79 73 63 61 6c 6c 29 3d 3d 32 30 20 29 3b 0a 0a  yscall)==20 );..
383b0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
383c0 6c 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20  l VFSes defined 
383d0 69 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72  in the aVfs[] ar
383e0 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ray */.  for(i=0
383f0 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73  ; i<(sizeof(aVfs
38400 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  )/sizeof(sqlite3
38410 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  _vfs)); i++){.  
38420 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
38430 67 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c  gister(&aVfs[i],
38440 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65   i==0);.  }.  re
38450 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
38460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
38470 77 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  wn the operating
38480 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
38490 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70  e..**.** Some op
384a0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20  erating systems 
384b0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f  might need to do
384c0 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e   some cleanup in
384d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a   this routine,.*
384e0 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e  * to release dyn
384f0 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
38500 65 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74  ed objects.  But
38510 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a   not on unix..**
38520 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69