/ Hex Artifact Content
Login

Artifact ddda0b1c5ae536669634d7bff31b3f8f4d654866:


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 7d 3b 20  ].pCurrent)..}; 
3770: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3780: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3790: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a  m calls */../*.*
37a0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
37b0: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
37c0: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
37d0: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
37e0: 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46  the.** "unix" VF
37f0: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
3800: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
3810: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
3820: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
3830: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
3840: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3850: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
3860: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
3870: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
3880: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
3890: 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79  ic int unixSetSy
38a0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
38b0: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
38c0: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
38d0: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
38e0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
38f0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
3900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3910: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
3920: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
3930: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3940: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
3950: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
3960: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
3970: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
3980: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
3990: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
39a0: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
39b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
39c0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
39d0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
39e0: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
39f0: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
3a00: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
3a10: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
3a20: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
3a30: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3a40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
3a50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3a60: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
3a70: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
3a80: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
3a90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
3aa0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3ab0: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
3ac0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3ad0: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
3ae0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
3af0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
3b00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
3b10: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
3b20: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
3b30: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
3b40: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
3b50: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
3b60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
3b70: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
3b80: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
3b90: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
3ba0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
3bb0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
3bc0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
3bd0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
3be0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
3bf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
3c00: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
3c10: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
3c20: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
3c30: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
3c40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3c50: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
3c60: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
3c70: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3c80: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
3c90: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
3ca0: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
3cb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3cc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3cd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3ce0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3cf0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
3d00: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
3d10: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
3d20: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
3d30: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
3d40: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
3d50: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
3d60: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
3d70: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
3d80: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
3d90: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
3da0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78  syscall_ptr unix
3db0: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
3dc0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
3dd0: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
3de0: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
3df0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
3e00: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
3e10: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
3e20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
3e30: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
3e40: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
3e50: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
3e60: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
3e70: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
3e80: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
3e90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
3ea0: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
3eb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
3ec0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
3ed0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
3ee0: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
3ef0: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
3f00: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
3f10: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3f20: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
3f30: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
3f40: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
3f50: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
3f60: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
3f70: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
3f80: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
3f90: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
3fa0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3fb0: 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65  r *unixNextSyste
3fc0: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
3fd0: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
3fe0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
3ff0: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
4000: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
4010: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4020: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
4030: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
4040: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
4050: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4060: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4070: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
4080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
4090: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
40a0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
40b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
40c0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
40d0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
40e0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
40f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4100: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f  }../*.** Retry o
4110: 70 65 6e 28 29 20 63 61 6c 6c 73 20 74 68 61 74  pen() calls that
4120: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
4130: 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  TR.*/.static int
4140: 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e   robust_open(con
4150: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
4160: 66 2c 20 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74  f, int m){.  int
4170: 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
4180: 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d  osOpen(z,f,m); }
4190: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
41a0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
41b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
41c0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
41d0: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
41e0: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
41f0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
4200: 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
4210: 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
4220: 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78  protect the unix
4230: 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a  InodeInfo and.**
4240: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
4250: 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74  bjects used by t
4260: 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
4270: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
4280: 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  * shared by mult
4290: 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
42a0: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69  .** Function uni
42b0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
42c0: 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29  used to assert()
42d0: 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c   that the global
42e0: 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65   mutex .** is he
42f0: 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64  ld when required
4300: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
4310: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
4320: 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
4330: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e   .** statements.
4340: 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e   e.g..**.**   un
4350: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  ixEnterMutex().*
4360: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e  *     assert( un
4370: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
4380: 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c  .**   unixEnterL
4390: 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63  eave().*/.static
43a0: 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d   void unixEnterM
43b0: 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
43c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
43d0: 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
43e0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
43f0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
4400: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
4410: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76  unixLeaveMutex(v
4420: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
4430: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
4440: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
4450: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
4460: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
4470: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4480: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
4490: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
44a0: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
44b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
44c0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
44d0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
44e0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
44f0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65  .#endif...#if de
4500: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
4510: 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  T) && defined(SQ
4520: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
4530: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
4540: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
4550: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
4560: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
4570: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
4580: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
4590: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
45a0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
45b0: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
45c0: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
45d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
45e0: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
45f0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
4600: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
4610: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
4620: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
4630: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
4640: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
4650: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
4660: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
4670: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
4680: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
4690: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
46a0: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
46b0: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
46c0: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
46d0: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
46e0: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
46f0: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
4700: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
4710: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
4720: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
4730: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
4740: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
4750: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4760: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
4770: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
4780: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
4790: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
47a0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
47b0: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
47c0: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
47d0: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
47e0: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
47f0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
4800: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
4810: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
4820: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
4830: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
4840: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
4850: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
4860: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
4870: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
4880: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
4890: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
48a0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
48b0: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
48c0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
48d0: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
48e0: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
48f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
4900: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
4910: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
4920: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4930: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
4940: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
4950: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
4960: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
4970: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
4980: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
4990: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
49a0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
49b0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
49c0: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
49d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
49e0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
49f0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
4a00: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
4a10: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
4a20: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
4a30: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
4a40: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
4a50: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
4a60: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
4a70: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
4a80: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
4a90: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
4aa0: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
4ab0: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
4ac0: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
4ad0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
4ae0: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
4af0: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
4b00: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
4b10: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
4b20: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
4b30: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
4b40: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
4b50: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
4b60: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
4b70: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
4b80: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
4b90: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
4ba0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
4bb0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
4bc0: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
4bd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
4be0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
4bf0: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
4c00: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
4c10: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
4c20: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
4c30: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
4c40: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
4c50: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
4c60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4c70: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4c80: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
4c90: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
4ca0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
4cb0: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
4cc0: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
4cd0: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
4ce0: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
4cf0: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
4d00: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
4d10: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
4d20: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
4d30: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
4d40: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
4d50: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
4d60: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
4d70: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
4d80: 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61   to EINTR.*/.sta
4d90: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
4da0: 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20  truncate(int h, 
4db0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
4dc0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
4dd0: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
4de0: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
4df0: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
4e00: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
4e10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4e20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
4e30: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
4e40: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
4e50: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
4e60: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
4e70: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
4e80: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
4e90: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
4ea0: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
4eb0: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
4ec0: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
4ed0: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
4ee0: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
4ef0: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
4f00: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
4f10: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
4f20: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
4f30: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
4f40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
4f50: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
4f60: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
4f70: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
4f80: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
4f90: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
4fa0: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
4fb0: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
4fc0: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
4fd0: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
4fe0: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
4ff0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
5000: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
5010: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
5020: 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69  {.  switch (posi
5030: 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a  xError) {.#if 0.
5040: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
5050: 74 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  t this code was 
5060: 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  not commented ou
5070: 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  t. In theory, th
5080: 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73  is branch.  ** s
5090: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68  hould never be h
50a0: 69 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63  it, as this func
50b0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
50c0: 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
50d0: 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d  .  ** a locking-
50e0: 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  related function
50f0: 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20   (i.e. fcntl()) 
5100: 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e  has returned non
5110: 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20  -zero with.  ** 
5120: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72  the value of err
5130: 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20  no as the first 
5140: 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20  argument. Since 
5150: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61  a system call ha
5160: 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65  s failed,.  ** e
5170: 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e  rrno should be n
5180: 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  on-zero..  **.  
5190: 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c  ** Despite this,
51a0: 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79   if errno really
51b0: 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69   is zero, we sti
51c0: 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  ll don't want to
51d0: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
51e0: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74  ITE_OK. The syst
51f0: 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20  em call failed, 
5200: 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74  and *some* SQLit
5210: 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62  e error should b
5220: 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65  e.  ** propagate
5230: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61  d back to the ca
5240: 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67  ller. Commenting
5250: 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74   this branch out
5260: 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a   means errno==0.
5270: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e    ** will be han
5280: 64 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66  dled by the "def
5290: 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f  ault:" case belo
52a0: 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30  w..  */.  case 0
52b0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
52c0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
52d0: 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a  .  case EAGAIN:.
52e0: 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54    case ETIMEDOUT
52f0: 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a  :.  case EBUSY:.
5300: 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20    case EINTR:.  
5310: 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20  case ENOLCK:  . 
5320: 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53     /* random NFS
5330: 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e   retry error, un
5340: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
5350: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
5360: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
5370: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
5380: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
5390: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
53a0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
53b0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20  ITE_BUSY;.    . 
53c0: 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20   case EACCES: . 
53d0: 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20     /* EACCES is 
53e0: 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69  like EAGAIN duri
53f0: 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ng locking opera
5400: 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61  tions, but not a
5410: 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a  ny other time*/.
5420: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49      if( (sqliteI
5430: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
5440: 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09  OERR_LOCK) || ..
5450: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
5460: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
5470: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
5480: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
5490: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
54a0: 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20  |..(sqliteIOErr 
54b0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
54c0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
54d0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  K) ){.      retu
54e0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
54f0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73      }.    /* els
5500: 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  e fall through *
5510: 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20  /.  case EPERM: 
5520: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5530: 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20  TE_PERM;.    .  
5540: 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e  /* EDEADLK is on
5550: 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61  ly possible if a
5560: 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46   call to fcntl(F
5570: 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65  _SETLKW) is made
5580: 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20  . And.  ** this 
5590: 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b  module never mak
55a0: 65 73 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20  es such a call. 
55b0: 41 6e 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20  And the code in 
55c0: 53 51 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20  SQLite itself . 
55d0: 20 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74   ** asserts that
55e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
55f0: 4f 43 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72  OCKED is never r
5600: 65 74 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65  eturned. For the
5610: 73 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20  se reasons.  ** 
5620: 74 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  this case is als
5630: 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e  o commented out.
5640: 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 64   If the system d
5650: 6f 65 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f  oes set errno to
5660: 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74   EDEADLK,.  ** t
5670: 68 65 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54  he default SQLIT
5680: 45 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65  E_IOERR_XXX code
5690: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
56a0: 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61  d. */.#if 0.  ca
56b0: 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20  se EDEADLK:.    
56c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
56d0: 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e  ERR_BLOCKED;.#en
56e0: 64 69 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50  dif.    .#if EOP
56f0: 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50  NOTSUPP!=ENOTSUP
5700: 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55  .  case EOPNOTSU
5710: 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65  PP: .    /* some
5720: 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69  thing went terri
5730: 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73  bly awry, unless
5740: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
5750: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
5760: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
5770: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
5780: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
5790: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
57a0: 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54  ndif.#ifdef ENOT
57b0: 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53  SUP.  case ENOTS
57c0: 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61  UP: .    /* inva
57d0: 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64  lid fd, unless d
57e0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
57f0: 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73  m support intros
5800: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
5810: 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74  h .     * it act
5820: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
5830: 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64   it says */.#end
5840: 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20  if.  case EIO:. 
5850: 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63   case EBADF:.  c
5860: 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61  ase EINVAL:.  ca
5870: 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63  se ENOTCONN:.  c
5880: 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61  ase ENODEV:.  ca
5890: 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65  se ENXIO:.  case
58a0: 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20   ENOENT:.#ifdef 
58b0: 45 53 54 41 4c 45 20 20 20 20 20 20 20 20 20 20  ESTALE          
58c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53             /* ES
58d0: 54 41 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69  TALE is not defi
58e0: 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73  ned on Interix s
58f0: 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65  ystems */.  case
5900: 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a   ESTALE:.#endif.
5910: 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20    case ENOSYS:. 
5920: 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75     /* these shou
5930: 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69  ld force the cli
5940: 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ent to close the
5950: 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e   file and reconn
5960: 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65  ect */.    .  de
5970: 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75  fault: .    retu
5980: 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a  rn sqliteIOErr;.
5990: 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a    }.}..../******
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59e0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
59f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
5a00: 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44  n Unique File ID
5a10: 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79   Utility Used By
5a20: 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a   VxWorks *******
5a30: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
5a40: 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20  n most versions 
5a50: 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20  of unix, we can 
5a60: 67 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20  get a unique ID 
5a70: 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f  for a file by co
5a80: 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74  ncatenating.** t
5a90: 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72  he device number
5aa0: 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e   and the inode n
5ab0: 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73  umber.  But this
5ac0: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
5ad0: 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e  n VxWorks..** On
5ae0: 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71   VxWorks, a uniq
5af0: 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20  ue file id must 
5b00: 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  be based on the 
5b10: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
5b20: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  me..**.** A poin
5b30: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
5b40: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
5b50: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61  ing structure ca
5b60: 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a  n be used as a.*
5b70: 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * unique file ID
5b80: 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61   in VxWorks.  Ea
5b90: 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
5ba0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f  his structure co
5bb0: 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79  ntains.** a copy
5bc0: 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   of the canonica
5bd0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65  l filename.  The
5be0: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66  re is also a ref
5bf0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a  erence count.  .
5c00: 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65  ** The structure
5c10: 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68   is reclaimed wh
5c20: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
5c30: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20   pointers to it 
5c40: 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f  drops to.** zero
5c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
5c60: 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e  e never very man
5c70: 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20  y files open at 
5c80: 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f  one time and loo
5c90: 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  kups are not.** 
5ca0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72  a performance-cr
5cb0: 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20  itical path, so 
5cc0: 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  it is sufficient
5cd0: 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a   to put these.**
5ce0: 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61   structures on a
5cf0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f   linked list..*/
5d00: 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  .struct vxworksF
5d10: 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74  ileId {.  struct
5d20: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
5d30: 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20  pNext;  /* Next 
5d40: 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65  in a list of the
5d50: 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  m all */.  int n
5d60: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
5d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5d80: 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
5d90: 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a   to this one */.
5da0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
5dd0: 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b   zCanonicalName[
5de0: 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68  ] string */.  ch
5df0: 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ar *zCanonicalNa
5e00: 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  me;         /* C
5e10: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
5e20: 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f  e */.};..#if OS_
5e30: 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41  VXWORKS./* .** A
5e40: 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61  ll unique filena
5e50: 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  mes are held on 
5e60: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65  a linked list he
5e70: 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  aded by this.** 
5e80: 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61  variable:.*/.sta
5e90: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
5ea0: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
5eb0: 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  sFileList = 0;..
5ec0: 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61  /*.** Simplify a
5ed0: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69   filename into i
5ee0: 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72  ts canonical for
5ef0: 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74  m.** by making t
5f00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
5f10: 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72  nges:.**.**  * r
5f20: 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69  emoving any trai
5f30: 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61  ling and duplica
5f40: 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  te /.**  * conve
5f50: 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74  rt /./ into just
5f60: 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74   /.**  * convert
5f70: 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20   /A/../ where A 
5f80: 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61  is any simple na
5f90: 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a  me into just /.*
5fa0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65  *.** Changes are
5fb0: 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20   made in-place. 
5fc0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20   Return the new 
5fd0: 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a  name length..**.
5fe0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
5ff0: 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a  filename is in z
6000: 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72  [0..n-1].  Retur
6010: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
6020: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ** characters in
6030: 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20   the simplified 
6040: 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
6050: 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  int vxworksSimpl
6060: 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c  ifyName(char *z,
6070: 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69   int n){.  int i
6080: 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  , j;.  while( n>
6090: 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27  1 && z[n-1]=='/'
60a0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72   ){ n--; }.  for
60b0: 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
60c0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
60d0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66  ='/' ){.      if
60e0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20  ( z[i+1]=='/' ) 
60f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6100: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20  if( z[i+1]=='.' 
6110: 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b  && i+2<n && z[i+
6120: 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  2]=='/' ){.     
6130: 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20     i += 1;.     
6140: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6150: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
6160: 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b  [i+1]=='.' && i+
6170: 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27  3<n && z[i+2]=='
6180: 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f  .' && z[i+3]=='/
6190: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  ' ){.        whi
61a0: 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31  le( j>0 && z[j-1
61b0: 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d  ]!='/' ){ j--; }
61c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30  .        if( j>0
61d0: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
61e0: 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20     i += 2;.     
61f0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6200: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
6210: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
6220: 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20  }.  z[j] = 0;.  
6230: 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a  return j;.}../*.
6240: 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65  ** Find a unique
6250: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65   file ID for the
6260: 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20   given absolute 
6270: 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72  pathname.  Retur
6280: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
6290: 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c  o the vxworksFil
62a0: 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  eId object.  Thi
62b0: 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65  s pointer is the
62c0: 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20   unique.** file 
62d0: 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52  ID..**.** The nR
62e0: 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ef field of the 
62f0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
6300: 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  ject is incremen
6310: 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ted before.** th
6320: 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75  e object is retu
6330: 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77  rned.  A new vxw
6340: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
6350: 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  t is created.** 
6360: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
6370: 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20   global list if 
6380: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
6390: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
63a0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
63b0: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
63c0: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  L..*/.static str
63d0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
63e0: 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69  d *vxworksFindFi
63f0: 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20  leId(const char 
6400: 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b  *zAbsoluteName){
6410: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
6420: 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20  sFileId *pNew;  
6430: 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68         /* search
6440: 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c   key and new fil
6450: 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74  e ID */.  struct
6460: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
6470: 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a  pCandidate;   /*
6480: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
6490: 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20  r existing file 
64a0: 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  IDs */.  int n; 
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
64d0: 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c  Length of zAbsol
64e0: 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a  uteName string *
64f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62  /..  assert( zAb
6500: 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27  soluteName[0]=='
6510: 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74  /' );.  n = (int
6520: 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74  )strlen(zAbsolut
6530: 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d  eName);.  pNew =
6540: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
6550: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
6560: 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20   (n+1) );.  if( 
6570: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
6580: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e   0;.  pNew->zCan
6590: 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68  onicalName = (ch
65a0: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
65b0: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61  memcpy(pNew->zCa
65c0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62  nonicalName, zAb
65d0: 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29  soluteName, n+1)
65e0: 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53  ;.  n = vxworksS
65f0: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77  implifyName(pNew
6600: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6610: 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  , n);..  /* Sear
6620: 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
6630: 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  ng entry that ma
6640: 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e  tching the canon
6650: 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20  ical name..  ** 
6660: 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d  If found, increm
6670: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
6680: 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75  e count and retu
6690: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
66a0: 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e    ** the existin
66b0: 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a  g file ID..  */.
66c0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
66d0: 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69  ();.  for(pCandi
66e0: 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65  date=vxworksFile
66f0: 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65  List; pCandidate
6700: 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61  ; pCandidate=pCa
6710: 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b  ndidate->pNext){
6720: 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64  .    if( pCandid
6730: 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20  ate->nName==n . 
6740: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43      && memcmp(pC
6750: 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e  andidate->zCanon
6760: 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e  icalName, pNew->
6770: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
6780: 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  n)==0.    ){.   
6790: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
67a0: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70  (pNew);.       p
67b0: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b  Candidate->nRef+
67c0: 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65  +;.       unixLe
67d0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
67e0: 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69     return pCandi
67f0: 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  date;.    }.  }.
6800: 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77  .  /* No match w
6810: 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69  as found.  We wi
6820: 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69  ll make a new fi
6830: 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d  le ID */.  pNew-
6840: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65  >nRef = 1;.  pNe
6850: 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20  w->nName = n;.  
6860: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78  pNew->pNext = vx
6870: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20  worksFileList;. 
6880: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
6890: 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c   = pNew;.  unixL
68a0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
68b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
68c0: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
68d0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
68e0: 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46  nt on a vxworksF
68f0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46  ileId object.  F
6900: 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ree.** the objec
6910: 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  t when the refer
6920: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
6930: 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  es zero..*/.stat
6940: 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52  ic void vxworksR
6950: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72  eleaseFileId(str
6960: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6970: 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45  d *pId){.  unixE
6980: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
6990: 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66  ssert( pId->nRef
69a0: 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65  >0 );.  pId->nRe
69b0: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e  f--;.  if( pId->
69c0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nRef==0 ){.    s
69d0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
69e0: 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f  eId **pp;.    fo
69f0: 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c  r(pp=&vxworksFil
6a00: 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70  eList; *pp && *p
6a10: 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28  p!=pId; pp = &((
6a20: 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a  *pp)->pNext)){}.
6a30: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d      assert( *pp=
6a40: 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20  =pId );.    *pp 
6a50: 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pId->pNext;.  
6a60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6a70: 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Id);.  }.  unixL
6a80: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23  eaveMutex();.}.#
6a90: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
6aa0: 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RKS */./********
6ab0: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55  ******* End of U
6ac0: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
6ad0: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
6ae0: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
6af0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
6b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b40: 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
6b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b90: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
6ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6bb0: 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73  **** Posix Advis
6bc0: 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ory Locking ****
6bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6be0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
6bf0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
6c00: 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62  cks are broken b
6c10: 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20  y design.  ANSI 
6c20: 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36  STD 1003.1 (1996
6c30: 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35  ).** section 6.5
6c40: 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74  .2.2 lines 483 t
6c50: 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69  hrough 490 speci
6c60: 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70  fy that when a p
6c70: 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f  rocess.** sets o
6c80: 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c  r clears a lock,
6c90: 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20   that operation 
6ca0: 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72  overrides any pr
6cb0: 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a  ior locks set.**
6cc0: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
6cd0: 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e  cess.  It does n
6ce0: 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61  ot explicitly sa
6cf0: 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69  y so, but this i
6d00: 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69  mplies.** that i
6d10: 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b  t overrides lock
6d20: 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d  s set by the sam
6d30: 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20  e process using 
6d40: 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  a different.** f
6d50: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
6d60: 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74   Consider this t
6d70: 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20  est case:.**.** 
6d80: 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20        int fd1 = 
6d90: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20  open("./file1", 
6da0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
6db0: 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20  0644);.**       
6dc0: 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22  int fd2 = open("
6dd0: 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52  ./file2", O_RDWR
6de0: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
6df0: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e  .**.** Suppose .
6e00: 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c  /file1 and ./fil
6e10: 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  e2 are really th
6e20: 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63  e same file (bec
6e30: 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61  ause.** one is a
6e40: 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69   hard or symboli
6e50: 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74  c link to the ot
6e60: 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75  her) then if you
6e70: 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75   set.** an exclu
6e80: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31  sive lock on fd1
6e90: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65  , then try to ge
6ea0: 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
6eb0: 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69  ock.** on fd2, i
6ec0: 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c  t works.  I woul
6ed0: 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20  d have expected 
6ee0: 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20  the second lock 
6ef0: 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65  to.** fail since
6f00: 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61   there was alrea
6f10: 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dy a lock on the
6f20: 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31   file due to fd1
6f30: 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e  ..** But not so.
6f40: 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63    Since both loc
6f50: 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65  ks came from the
6f60: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74   same process, t
6f70: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65  he.** second ove
6f80: 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74  rrides the first
6f90: 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  , even though th
6fa0: 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65  ey were on diffe
6fb0: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
6fc0: 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
6fd0: 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  on different fil
6fe0: 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  e names..**.** T
6ff0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77  his means that w
7000: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53  e cannot use POS
7010: 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63  IX locks to sync
7020: 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63  hronize file acc
7030: 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d  ess.** among com
7040: 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f  peting threads o
7050: 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  f the same proce
7060: 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73  ss.  POSIX locks
7070: 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a   will work fine.
7080: 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ** to synchroniz
7090: 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72  e access for thr
70a0: 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65  eads in separate
70b0: 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20   processes, but 
70c0: 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77  not.** threads w
70d0: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70  ithin the same p
70e0: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  rocess..**.** To
70f0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
7100: 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65   problem, SQLite
7110: 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66   has to manage f
7120: 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e  ile locks intern
7130: 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f  ally.** on its o
7140: 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20  wn.  Whenever a 
7150: 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
7160: 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20  opened, we have 
7170: 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73  to find the.** s
7180: 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66  pecific inode of
7190: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
71a0: 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73  le (the inode is
71b0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
71c0: 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64  he.** st_dev and
71d0: 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f   st_ino fields o
71e0: 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63  f the stat struc
71f0: 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28  ture that fstat(
7200: 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61  ) fills in).** a
7210: 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63  nd check for loc
7220: 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ks already exist
7230: 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64  ing on that inod
7240: 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61  e.  When locks a
7250: 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72  re.** created or
7260: 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76   removed, we hav
7270: 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72  e to look at our
7280: 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65   own internal re
7290: 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  cord of the.** l
72a0: 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ocks to see if a
72b0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
72c0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
72d0: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20   a lock on that 
72e0: 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a  same.** inode..*
72f0: 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65  *.** (Aside: The
7300: 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75   use of inode nu
7310: 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20  mbers as unique 
7320: 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  IDs does not wor
7330: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
7340: 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65   For VxWorks, we
7350: 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65   have to use the
7360: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69   alternative uni
7370: 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61  que ID system ba
7380: 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69  sed on.** canoni
7390: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  cal filename and
73a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20   implemented in 
73b0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76  the previous div
73c0: 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ision.).**.** Th
73d0: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
73e0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
73f0: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
7400: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
7410: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
7420: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
7430: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7440: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
7450: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
7460: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
7470: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
7480: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
7490: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
74a0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
74b0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
74c0: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
74d0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
74e0: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
74f0: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
7500: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
7510: 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78  twice, both unix
7520: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a  File structures.
7530: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ** point to the 
7540: 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  same locking str
7550: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63  ucture.  The loc
7560: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  king structure k
7570: 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  eeps.** a refere
7580: 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65  nce count (so we
7590: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20   will know when 
75a0: 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e  to delete it) an
75b0: 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65  d a "cnt".** fie
75c0: 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73  ld that tells us
75d0: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   its internal lo
75e0: 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d  ck status.  cnt=
75f0: 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  =0 means the.** 
7600: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
7610: 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73  .  cnt==-1 means
7620: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e   the file has an
7630: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
7640: 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20  .** cnt>0 means 
7650: 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68  there are cnt sh
7660: 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ared locks on th
7670: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  e file..**.** An
7680: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63  y attempt to loc
7690: 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69  k or unlock a fi
76a0: 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20  le first checks 
76b0: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  the locking.** s
76c0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66  tructure.  The f
76d0: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
76e0: 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b  ll is only invok
76f0: 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20  ed to set a .** 
7700: 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68  POSIX lock if th
7710: 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  e internal lock 
7720: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69  structure transi
7730: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a  tions between.**
7740: 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e   a locked and an
7750: 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e   unlocked state.
7760: 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a  .**.** But wait:
7770: 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20    there are yet 
7780: 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69  more problems wi
7790: 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  th POSIX advisor
77a0: 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49  y locks..**.** I
77b0: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
77c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
77d0: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
77e0: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
77f0: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
7800: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
7810: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
7820: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
7830: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
7840: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
7850: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
7860: 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64  m, each unixInod
7870: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20  eInfo object.** 
7880: 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e  maintains a coun
7890: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
78a0: 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73  of pending locks
78b0: 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a   on tha inode..*
78c0: 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  * When an attemp
78d0: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f  t is made to clo
78e0: 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20  se an unixFile, 
78f0: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
7900: 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f  other unixFile o
7910: 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
7920: 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68  inode that are h
7930: 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68  olding locks, th
7940: 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f  e call.** to clo
7950: 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65  se() the file de
7960: 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65  scriptor is defe
7970: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f  rred until all o
7980: 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61  f the locks clea
7990: 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e  r..** The unixIn
79a0: 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  odeInfo structur
79b0: 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f  e keeps a list o
79c0: 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  f file descripto
79d0: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  rs that need to.
79e0: 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ** be closed and
79f0: 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61   that list is wa
7a00: 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65  lked (and cleare
7a10: 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  d) when the last
7a20: 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e   lock.** clears.
7a30: 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68  .**.** Yet anoth
7a40: 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e  er problem:  Lin
7a50: 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74  uxThreads do not
7a60: 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20   play well with 
7a70: 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  posix locks..**.
7a80: 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65  ** Many older ve
7a90: 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20  rsions of linux 
7aa0: 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72  use the LinuxThr
7ab0: 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69  eads library whi
7ac0: 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73  ch is.** not pos
7ad0: 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55  ix compliant.  U
7ae0: 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64  nder LinuxThread
7af0: 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  s, a lock create
7b00: 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41  d by thread.** A
7b10: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66   cannot be modif
7b20: 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65  ied or overridde
7b30: 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74  n by a different
7b40: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
7b50: 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ly thread A can 
7b60: 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e  modify the lock.
7b70: 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69    Locking behavi
7b80: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a  or is correct.**
7b90: 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69   if the appliati
7ba0: 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65  on uses the newe
7bb0: 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54  r Native Posix T
7bc0: 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e  hread Library (N
7bd0: 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78  PTL).** on linux
7be0: 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c   - with NPTL a l
7bf0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
7c00: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
7c10: 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e  ride locks.** in
7c20: 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20   thread B.  But 
7c30: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
7c40: 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69  to know at compi
7c50: 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a  le-time which.**
7c60: 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61   threading libra
7c70: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
7c80: 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e  .  So there is n
7c90: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
7ca0: 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  .** compile-time
7cb0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
7cc0: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
7cd0: 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  rride locks on t
7ce0: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20  hread B..** One 
7cf0: 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d  has to do a run-
7d00: 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69  time check to di
7d10: 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76  scover the behav
7d20: 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ior of the.** cu
7d30: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a  rrent process..*
7d40: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64  *.** SQLite used
7d50: 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75   to support Linu
7d60: 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73  xThreads.  But s
7d70: 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78  upport for Linux
7d80: 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64  Threads.** was d
7d90: 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67  ropped beginning
7da0: 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e   with version 3.
7db0: 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c  7.0.  SQLite wil
7dc0: 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74  l still work wit
7dd0: 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64  h.** LinuxThread
7de0: 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  s provided that 
7df0: 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (1) there is no 
7e00: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
7e10: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72  nnection .** per
7e20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
7e30: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
7e40: 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62  ss and (2) datab
7e50: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
7e60: 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61  ** do not move a
7e70: 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a  cross threads..*
7e80: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
7e90: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
7ea0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
7eb0: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
7ec0: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
7ed0: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
7ee0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
7ef0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  bject..*/.struct
7f00: 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20   unixFileId {.  
7f10: 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20  dev_t dev;      
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
7f30: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  evice number */.
7f40: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
7f50: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
7f60: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20  ileId *pId;  /* 
7f70: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  Unique file ID f
7f80: 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23  or vxworks. */.#
7f90: 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  else.  ino_t ino
7fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7fb0: 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62     /* Inode numb
7fc0: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
7fd0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
7fe0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
7ff0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
8000: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
8010: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
8020: 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78  e.  Or, on Linux
8030: 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69  Threads, there i
8040: 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73  s one of these s
8050: 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a  tructures for.**
8060: 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e   each inode open
8070: 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61  ed by each threa
8080: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c  d..**.** A singl
8090: 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65  e inode can have
80a0: 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64   multiple file d
80b0: 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65  escriptors, so e
80c0: 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  ach unixFile.** 
80d0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
80e0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
80f0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
8100: 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  his object and t
8110: 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65  his.** object ke
8120: 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  eps a count of t
8130: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69  he number of uni
8140: 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74  xFile pointing t
8150: 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  o it..*/.struct 
8160: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a  unixInodeInfo {.
8170: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
8180: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20  eId fileId;     
8190: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
81a0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  key */.  int nSh
81b0: 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  ared;           
81c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
81d0: 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63  er of SHARED loc
81e0: 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73  ks held */.  uns
81f0: 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65  igned char eFile
8200: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20  Lock;        /* 
8210: 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f  One of SHARED_LO
8220: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
8230: 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69  K etc. */.  unsi
8240: 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63 65  gned char bProce
8250: 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41  ssLock;     /* A
8260: 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63  n exclusive proc
8270: 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ess lock is held
8280: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
82b0: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
82c0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
82d0: 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
82e0: 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
82f0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
8300: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
8310: 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a  ith this inode *
8320: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8350: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c   outstanding fil
8360: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69  e locks */.  Uni
8370: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
8380: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
8390: 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  Unused file desc
83a0: 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65  riptors to close
83b0: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
83c0: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
83d0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
83e0: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
83f0: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
8400: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
8410: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
8420: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
8430: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20  y linked */.#if 
8440: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
8450: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e  CKING_STYLE.  un
8460: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
8470: 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a   sharedByte;  /*
8480: 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74   for AFP simulat
8490: 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  ed shared lock *
84a0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  /.#endif.#if OS_
84b0: 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20  VXWORKS.  sem_t 
84c0: 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pSem;          
84d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
84e0: 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f  ed POSIX semapho
84f0: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65  re */.  char aSe
8500: 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  mName[MAX_PATHNA
8510: 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20  ME+2];  /* Name 
8520: 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72  of that semaphor
8530: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
8540: 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66  /*.** A lists of
8550: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
8560: 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73  fo objects..*/.s
8570: 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49  tatic unixInodeI
8580: 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d  nfo *inodeList =
8590: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68   0;../*.**.** Th
85a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e  is function - un
85b0: 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20  ixLogError_x(), 
85c0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
85d0: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
85e0: 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f  o.** unixLogErro
85f0: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  r()..**.** It is
8600: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
8610: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
8620: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
8630: 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62   and errno has b
8640: 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c  een.** set. It l
8650: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
8660: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
8670: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
8680: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
8690: 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20  f.** errno and, 
86a0: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
86b0: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
86c0: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
86d0: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a  strerror() or.**
86e0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a   strerror_r()..*
86f0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
8700: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
8710: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
8720: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
8730: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
8740: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
8750: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
8760: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
8770: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
8780: 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f  EN). .** The two
8790: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
87a0: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
87b0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
87c0: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
87d0: 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e  .** failed (e.g.
87e0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e   "unlink", "open
87f0: 22 29 20 61 6e 64 20 74 68 65 20 74 68 65 20 61  ") and the the a
8800: 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73  ssociated file-s
8810: 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69  ystem path,.** i
8820: 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  f any..*/.#defin
8830: 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61  e unixLogError(a
8840: 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f  ,b,c)     unixLo
8850: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62  gErrorAtLine(a,b
8860: 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61  ,c,__LINE__).sta
8870: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45  tic int unixLogE
8880: 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e  rrorAtLine(.  in
8890: 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20  t errcode,      
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
88b0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
88c0: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
88d0: 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20  ar *zFunc,      
88e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
88f0: 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  of OS function t
8900: 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  hat failed */.  
8910: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
8920: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
8930: 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73  /* File path ass
8940: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72  ociated with err
8950: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  or */.  int iLin
8960: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
8970: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
8980: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68  e line number wh
8990: 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ere error occurr
89a0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ed */.){.  char 
89b0: 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20  *zErr;          
89c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
89d0: 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72  ssage from strer
89e0: 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c  ror() or equival
89f0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72  ent */.  int iEr
8a00: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20  rno = errno;    
8a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65           /* Save
8a20: 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20  d syscall error 
8a30: 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  number */..  /* 
8a40: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
8a50: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
8a60: 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  d (SQLITE_THREAD
8a70: 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75  SAFE==0), then u
8a80: 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65  se.  ** the stre
8a90: 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  rror() function 
8aa0: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75  to obtain the hu
8ab0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72  man-readable err
8ac0: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
8ad0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72  equivalent to er
8ae0: 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
8af0: 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29  use strerror_r()
8b00: 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49  ..  */ .#if SQLI
8b10: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
8b20: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54   defined(HAVE_ST
8b30: 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72  RERROR_R).  char
8b40: 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d   aErr[80];.  mem
8b50: 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a  set(aErr, 0, siz
8b60: 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45  eof(aErr));.  zE
8b70: 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a  rr = aErr;..  /*
8b80: 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43   If STRERROR_R_C
8b90: 48 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75  HAR_P (set by au
8ba0: 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20  toconf scripts) 
8bb0: 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20  or __USE_GNU is 
8bc0: 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73  defined,.  ** as
8bd0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
8be0: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
8bf0: 65 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  e the GNU versio
8c00: 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28  n of strerror_r(
8c10: 29 20 74 68 61 74 20 0a 20 20 2a 2a 20 72 65 74  ) that .  ** ret
8c20: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
8c30: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
8c40: 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  ining the error 
8c50: 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f  message. That po
8c60: 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20  inter .  ** may 
8c70: 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c  point to aErr[],
8c80: 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74   or it may point
8c90: 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20   to some static 
8ca0: 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72  storage somewher
8cb0: 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  e. .  ** Otherwi
8cc0: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
8cd0: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
8ce0: 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65  des the POSIX ve
8cf0: 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73  rsion of .  ** s
8d00: 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69  trerror_r(), whi
8d10: 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73  ch always writes
8d20: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
8d30: 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20  e into aErr[].. 
8d40: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
8d50: 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  code incorrectly
8d60: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
8d70: 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65   is the POSIX ve
8d80: 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20  rsion that is.  
8d90: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ** available, th
8da0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
8db0: 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e  will often be an
8dc0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e   empty string. N
8dd0: 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70  ot a.  ** huge p
8de0: 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63  roblem. Incorrec
8df0: 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74  tly concluding t
8e00: 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73  hat the GNU vers
8e10: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
8e20: 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61   .  ** could lea
8e30: 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20  d to a segfault 
8e40: 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66  though..  */.#if
8e50: 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f   defined(STRERRO
8e60: 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64  R_R_CHAR_P) || d
8e70: 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55  efined(__USE_GNU
8e80: 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e  ).  zErr = .# en
8e90: 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72  dif.  strerror_r
8ea0: 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73  (iErrno, aErr, s
8eb0: 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a  izeof(aErr)-1);.
8ec0: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48  .#elif SQLITE_TH
8ed0: 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68  READSAFE.  /* Th
8ee0: 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61  is is a threadsa
8ef0: 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74  fe build, but st
8f00: 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f  rerror_r() is no
8f10: 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a  t available. */.
8f20: 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c    zErr = "";.#el
8f30: 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65  se.  /* Non-thre
8f40: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73  adsafe build, us
8f50: 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f  e strerror(). */
8f60: 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72  .  zErr = strerr
8f70: 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64  or(iErrno);.#end
8f80: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 65 72  if..  assert( er
8f90: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
8fa0: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
8fb0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
8fc0: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
8fd0: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
8fe0: 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64  s_unix.c:%d: (%d
8ff0: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
9000: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72        iLine, iEr
9010: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
9020: 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20  h, zErr.  );..  
9030: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
9040: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
9050: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9060: 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
9070: 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61  e that close() a
9080: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72  lmost always wor
9090: 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20  ks, since it is 
90a0: 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72  only in a.** ver
90b0: 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69  y sick applicati
90c0: 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20  on or on a very 
90d0: 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68  sick platform th
90e0: 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c  at it might fail
90f0: 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20  ..** If it does 
9100: 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61  fail, simply lea
9110: 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  k the file descr
9120: 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f  iptor, but do lo
9130: 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a  g the.** error..
9140: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
9150: 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  it is not safe t
9160: 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20  o retry close() 
9170: 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63  after EINTR sinc
9180: 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65  e the.** file de
9190: 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68  scriptor might h
91a0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
91b0: 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68   reused by anoth
91c0: 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f  er thread..** So
91d0: 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74   we don't even t
91e0: 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ry to recover fr
91f0: 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75  om an EINTR.  Ju
9200: 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72  st log the error
9210: 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e  .** and move on.
9220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9230: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69  robust_close(uni
9240: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
9250: 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29  t h, int lineno)
9260: 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28  {.  if( osClose(
9270: 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f  h) ){.    unixLo
9280: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c  gErrorAtLine(SQL
9290: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
92a0: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20   "close",.      
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e   pFile ? pFile->
92d0: 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e  zPath : 0, linen
92e0: 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
92f0: 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20   Close all file 
9300: 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75  descriptors accu
9310: 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e  muated in the un
9320: 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e  ixInodeInfo->pUn
9330: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73  used list..*/ .s
9340: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
9350: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
9360: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
9370: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
9380: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
9390: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
93a0: 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55  edFd *p;.  UnixU
93b0: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a  nusedFd *pNext;.
93c0: 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e    for(p=pInode->
93d0: 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e  pUnused; p; p=pN
93e0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
93f0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
9400: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
9410: 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e  le, p->fd, __LIN
9420: 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E__);.    sqlite
9430: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20  3_free(p);.  }. 
9440: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
9450: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
9460: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f  elease a unixIno
9470: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
9480: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
9490: 63 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f  cated by findIno
94a0: 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20  deInfo()..**.** 
94b0: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
94c0: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
94d0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
94e0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
94f0: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
9500: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
9510: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
9520: 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  id releaseInodeI
9530: 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nfo(unixFile *pF
9540: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
9550: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
9560: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
9570: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
9580: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
9590: 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29  ( ALWAYS(pInode)
95a0: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   ){.    pInode->
95b0: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
95c0: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  pInode->nRef==0 
95d0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
95e0: 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
95f0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c  e==0 );.      cl
9600: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
9610: 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
9620: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b  pInode->pPrev ){
9630: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9640: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
9650: 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  pNext==pInode );
9660: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
9670: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
9680: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
9690: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
96a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64      assert( inod
96b0: 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  eList==pInode );
96c0: 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69  .        inodeLi
96d0: 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  st = pInode->pNe
96e0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
96f0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e    if( pInode->pN
9700: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
9710: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
9720: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e  Next->pPrev==pIn
9730: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
9740: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
9750: 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50  rev = pInode->pP
9760: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
9770: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9780: 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  pInode);.    }. 
9790: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
97a0: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
97b0: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20  tor, locate the 
97c0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
97d0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73  ject that.** des
97e0: 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65  cribes that file
97f0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72   descriptor.  Cr
9800: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
9810: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
9820: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
9830: 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69  e might be unini
9840: 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65  tialized if an e
9850: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  rror occurs..**.
9860: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
9870: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
9880: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
9890: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
98a0: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
98b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
98c0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
98d0: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
98e0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
98f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
9900: 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e  dInodeInfo(.  un
9910: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9930: 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66  Unix file with f
9940: 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e  ile desc used in
9950: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e   the key */.  un
9960: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70  ixInodeInfo **pp
9970: 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20  Inode        /* 
9980: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49  Return the unixI
9990: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
99a0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
99b0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
99d0: 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72  ystem call retur
99e0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
99f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
9a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9a10: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9a20: 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20  r for pFile */. 
9a30: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
9a40: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
9a50: 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f  /* Lookup key fo
9a60: 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  r the unixInodeI
9a70: 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nfo */.  struct 
9a80: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
9a90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
9aa0: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
9ab0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49  ation */.  unixI
9ac0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
9ad0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e   = 0;     /* Can
9ae0: 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65  didate unixInode
9af0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  Info object */..
9b00: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
9b10: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20  texHeld() );..  
9b20: 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c  /* Get low-level
9b30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
9b40: 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  ut the file that
9b50: 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a   we can used to.
9b60: 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e    ** create a un
9b70: 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  ique name for th
9b80: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  e file..  */.  f
9b90: 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
9ba0: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
9bb0: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
9bc0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc!=0 ){.    p
9bd0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
9be0: 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20  = errno;.#ifdef 
9bf0: 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66  EOVERFLOW.    if
9c00: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
9c10: 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20  no==EOVERFLOW ) 
9c20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
9c30: 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LFS;.#endif.    
9c40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
9c50: 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ERR;.  }..#ifdef
9c60: 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20   __APPLE__.  /* 
9c70: 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73  On OS X on an ms
9c80: 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20  dos filesystem, 
9c90: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
9ca0: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a   is reported.  *
9cb0: 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f  * incorrectly fo
9cc0: 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65  r zero-size file
9cd0: 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  s.  See ticket #
9ce0: 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20  3260.  To work. 
9cf0: 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20   ** around this 
9d00: 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73  problem (we cons
9d10: 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e  ider it a bug in
9d20: 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74   OS X, not SQLit
9d30: 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79  e).  ** we alway
9d40: 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  s increase the f
9d50: 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79  ile size to 1 by
9d60: 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
9d70: 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f  e byte.  ** prio
9d80: 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74  r to accessing t
9d90: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
9da0: 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77    The one byte w
9db0: 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61  ritten is.  ** a
9dc0: 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72  n ASCII 'S' char
9dd0: 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f  acter which also
9de0: 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
9df0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
9e00: 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ** in the header
9e10: 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65   of every SQLite
9e20: 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74   database.  In t
9e30: 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72  his way, if ther
9e40: 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65  e.  ** is a race
9e50: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20   condition such 
9e60: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72  that another thr
9e70: 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ead has already 
9e80: 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74  populated.  ** t
9e90: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
9ea0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
9eb0: 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65  o damage is done
9ec0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61  ..  */.  if( sta
9ed0: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20  tbuf.st_size==0 
9ee0: 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61  && (pFile->fsFla
9ef0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c  gs & SQLITE_FSFL
9f00: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30  AGS_IS_MSDOS)!=0
9f10: 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d   ){.    do{ rc =
9f20: 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22   osWrite(fd, "S"
9f30: 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  , 1); }while( rc
9f40: 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
9f50: 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  TR );.    if( rc
9f60: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=1 ){.      pFi
9f70: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
9f80: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
9f90: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
9fb0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
9fc0: 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
9fd0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  rc!=0 ){.      p
9fe0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
9ff0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
a000: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
a010: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
a020: 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26  ndif..  memset(&
a030: 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f  fileId, 0, sizeo
a040: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69  f(fileId));.  fi
a050: 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62  leId.dev = statb
a060: 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f  uf.st_dev;.#if O
a070: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65  S_VXWORKS.  file
a080: 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e  Id.pId = pFile->
a090: 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c  pId;.#else.  fil
a0a0: 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  eId.ino = statbu
a0b0: 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66  f.st_ino;.#endif
a0c0: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64  .  pInode = inod
a0d0: 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
a0e0: 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70  pInode && memcmp
a0f0: 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64  (&fileId, &pInod
a100: 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  e->fileId, sizeo
a110: 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20  f(fileId)) ){.  
a120: 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
a130: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  e->pNext;.  }.  
a140: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
a150: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71  .    pInode = sq
a160: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
a170: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
a180: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
a190: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
a1a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
a1b0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
a1c0: 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a  t(pInode, 0, siz
a1d0: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20  eof(*pInode));. 
a1e0: 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64     memcpy(&pInod
a1f0: 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65  e->fileId, &file
a200: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
a210: 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d));.    pInode-
a220: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
a230: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69  Inode->pNext = i
a240: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49  nodeList;.    pI
a250: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b  node->pPrev = 0;
a260: 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69  .    if( inodeLi
a270: 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e  st ) inodeList->
a280: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a  pPrev = pInode;.
a290: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
a2a0: 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  pInode;.  }else{
a2b0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
a2c0: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e  f++;.  }.  *ppIn
a2d0: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ode = pInode;.  
a2e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a2f0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
a300: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
a310: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
a320: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
a330: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
a340: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
a350: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
a360: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
a370: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
a380: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
a390: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
a3a0: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
a3b0: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
a3c0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
a3d0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
a3e0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
a3f0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
a400: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
a410: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
a420: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
a430: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
a440: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
a450: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
a460: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
a470: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
a480: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
a490: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
a4a0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
a4b0: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
a4c0: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
a4d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
a4e0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
a4f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
a500: 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  e );.  unixEnter
a510: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
a520: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
a530: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
a540: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
a550: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
a560: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
a570: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
a580: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
a590: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
a5a0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
a5b0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
a5c0: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  erved = 1;.  }..
a5d0: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
a5e0: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
a5f0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
a600: 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
a610: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20  __DJGPP__.  if( 
a620: 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46  !reserved && !pF
a630: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
a640: 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20  ocessLock ){.   
a650: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
a660: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
a670: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
a680: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
a690: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
a6a0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
a6b0: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
a6c0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
a6d0: 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e  K;.    if( osFcn
a6e0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
a6f0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  ETLK, &lock) ){.
a700: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a710: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
a720: 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  ERVEDLOCK;.     
a730: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a740: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d  o = errno;.    }
a750: 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c   else if( lock.l
a760: 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29  _type!=F_UNLCK )
a770: 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  {.      reserved
a780: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
a790: 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78  #endif.  .  unix
a7a0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
a7b0: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
a7c0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
a7d0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
a7e0: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
a7f0: 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
a800: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
a810: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a820: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
a830: 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20  t a system-lock 
a840: 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c  on the file pFil
a850: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
a860: 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 79  .** described by
a870: 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66   pLock..**.** If
a880: 20 74 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f   the pFile was o
a890: 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65  pened read/write
a8a0: 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c   from unix-excl,
a8b0: 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c   then the only l
a8c0: 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61  ock.** ever obta
a8d0: 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75  ined is an exclu
a8e0: 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69  sive lock, and i
a8f0: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78  t is obtained ex
a900: 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68  actly once.** th
a910: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79  e first time any
a920: 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74   lock is attempt
a930: 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75  ed.  All subsequ
a940: 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69  ent system locki
a950: 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73  ng.** operations
a960: 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20   become no-ops. 
a970: 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   Locking operati
a980: 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e  ons still happen
a990: 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20   internally,.** 
a9a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72  in order to coor
a9b0: 64 69 6e 61 74 65 20 61 63 63 65 73 73 20 62 65  dinate access be
a9c0: 74 77 65 65 6e 20 73 65 70 61 72 61 74 65 20 64  tween separate d
a9d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
a9e0: 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ons.** within th
a9f0: 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20  is process, but 
aa00: 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68  all of that is h
aa10: 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79  andled in memory
aa20: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72   and the.** oper
aa30: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65  ating system doe
aa40: 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74  s not participat
aa50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e..**.** This fu
aa60: 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73  nction is a pass
aa70: 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74  -through to fcnt
aa80: 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46  l(F_SETLK) if pF
aa90: 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20  ile is using.** 
aaa0: 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74 68  any VFS other th
aab0: 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f  an "unix-excl" o
aac0: 72 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70  r if pFile is op
aad0: 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78  ened on "unix-ex
aae0: 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65  cl".** and is re
aaf0: 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a  ad-only..**.** Z
ab00: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
ab10: 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70  if the call comp
ab20: 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c  letes successful
ab30: 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63  ly, or -1 if a c
ab40: 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28  all.** to fcntl(
ab50: 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  ) fails. In this
ab60: 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20   case, errno is 
ab70: 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c  set appropriatel
ab80: 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a  y (by fcntl())..
ab90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
aba0: 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46  ixFileLock(unixF
abb0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75  ile *pFile, stru
abc0: 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29  ct flock *pLock)
abd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
abe0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
abf0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
ac00: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
ac10: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
ac20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
ac30: 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  de!=0 );.  if( (
ac40: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
ac50: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43  s & UNIXFILE_EXC
ac60: 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d  L)!=0 || pInode-
ac70: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20  >bProcessLock). 
ac80: 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74    && ((pFile->ct
ac90: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
aca0: 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20  LE_RDONLY)==0). 
acb0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   ){.    if( pIno
acc0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
acd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
ace0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
acf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
ad00: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
ad10: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
ad20: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
ad30: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
ad40: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
ad50: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
ad60: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
ad70: 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  IZE;.      lock.
ad80: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
ad90: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46  ;.      rc = osF
ada0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
adb0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
adc0: 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29        if( rc<0 )
add0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ade0: 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65    pInode->bProce
adf0: 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  ssLock = 1;.    
ae00: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
ae10: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
ae20: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
ae30: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
ae40: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
ae50: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70  e->h, F_SETLK, p
ae60: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Lock);.  }.  ret
ae70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ae80: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
ae90: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
aea0: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
aeb0: 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
aec0: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
aed0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
aee0: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
aef0: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
af00: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
af10: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
af20: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
af30: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
af40: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
af50: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
af60: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
af70: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
af80: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
af90: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
afa0: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
afb0: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
afc0: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
afd0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
afe0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
aff0: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
b000: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
b010: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
b020: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
b030: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
b040: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
b050: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
b060: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
b070: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
b080: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
b090: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
b0a0: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
b0b0: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
b0c0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
b0d0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
b0e0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
b0f0: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
b100: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
b110: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
b120: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
b130: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b140: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
b150: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
b160: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
b170: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
b180: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
b190: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
b1a0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
b1b0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
b1c0: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
b1d0: 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  ck){.  /* The fo
b1e0: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
b1f0: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
b200: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
b210: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
b220: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
b230: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
b240: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
b250: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
b260: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
b270: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
b280: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
b290: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
b2a0: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
b2b0: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
b2c0: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
b2d0: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
b2e0: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
b2f0: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
b300: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
b310: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
b320: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
b330: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
b340: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
b350: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
b360: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
b370: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
b380: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
b390: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
b3a0: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
b3b0: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
b3c0: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
b3d0: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
b3e0: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
b3f0: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
b400: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
b410: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
b420: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
b430: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
b440: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
b450: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
b460: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
b470: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
b480: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
b490: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
b4a0: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
b4b0: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
b4c0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
b4d0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
b4e0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
b4f0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
b500: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
b510: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
b520: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
b530: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
b540: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
b550: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
b560: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
b570: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
b580: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
b590: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
b5a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
b5b0: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
b5c0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
b5d0: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
b5e0: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
b5f0: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
b600: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
b610: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
b620: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
b630: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
b640: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
b650: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
b660: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
b670: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
b680: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
b690: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
b6a0: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
b6b0: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
b6c0: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
b6d0: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
b6e0: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
b6f0: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
b700: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
b710: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
b720: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
b730: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
b740: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
b750: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
b760: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
b770: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
b780: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
b790: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
b7a0: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
b7b0: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
b7c0: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
b7d0: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
b7e0: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
b7f0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
b800: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
b810: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
b820: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
b830: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
b840: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
b850: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
b860: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
b870: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
b880: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
b890: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
b8a0: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
b8b0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
b8c0: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
b8d0: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
b8e0: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
b8f0: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
b900: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
b910: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
b920: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
b930: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
b940: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
b950: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
b960: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
b970: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
b980: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
b990: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
b9a0: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
b9b0: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
b9c0: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
b9d0: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
b9e0: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
b9f0: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
ba00: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
ba10: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
ba20: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
ba30: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
ba40: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
ba50: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
ba60: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
ba70: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74  ck lock;.  int t
ba80: 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  Errno = 0;..  as
ba90: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
baa0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
bab0: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
bac0: 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %s,%d) pid=%d (u
bad0: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
bae0: 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c  h,.      azFileL
baf0: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
bb00: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
bb10: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
bb20: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
bb30: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
bb40: 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d  ileLock), pFile-
bb50: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
bb60: 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a   , getpid()));..
bb70: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
bb80: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
bb90: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
bba0: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
bbb0: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
bbc0: 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
bbd0: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
bbe0: 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
bbf0: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
bc00: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
bc10: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
bc20: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
bc30: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
bc40: 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
bc50: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
bc60: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
bc70: 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
bc80: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
bc90: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
bca0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
bcb0: 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
bcc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
bcd0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
bce0: 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
bcf0: 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
bd00: 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ct..  **  (1) We
bd10: 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
bd20: 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
bd30: 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
bd40: 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
bd50: 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
bd60: 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
bd70: 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
bd80: 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
bd90: 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
bda0: 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
bdb0: 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
bdc0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
bdd0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
bde0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
bdf0: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
be00: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
be10: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
be20: 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
be30: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
be40: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
be50: 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
be60: 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
be70: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
be80: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
be90: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
bea0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
beb0: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
bec0: 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
bed0: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
bee0: 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
bef0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
bf00: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
bf10: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
bf20: 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
bf30: 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
bf40: 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
bf50: 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
bf60: 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
bf70: 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
bf80: 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
bf90: 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
bfa0: 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
bfb0: 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
bfc0: 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
bfd0: 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
bfe0: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
bff0: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
c000: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
c010: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
c020: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
c030: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41  }..  /* If a SHA
c040: 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
c050: 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
c060: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
c070: 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
c080: 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
c090: 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
c0a0: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
c0b0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
c0c0: 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
c0d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
c0e0: 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
c0f0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
c100: 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65  & .      (pInode
c110: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
c120: 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
c130: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
c140: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
c150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
c160: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
c170: 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
c180: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
c190: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
c1a0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
c1b0: 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
c1c0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
c1d0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
c1e0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
c1f0: 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
c200: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
c210: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
c220: 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49  }...  /* A PENDI
c230: 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
c240: 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
c250: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
c260: 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
c270: 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
c280: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
c290: 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
c2a0: 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
c2b0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
c2c0: 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  eased..  */.  lo
c2d0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
c2e0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
c2f0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28   SEEK_SET;.  if(
c300: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c310: 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
c320: 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
c330: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
c340: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c350: 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
c360: 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   ){.    lock.l_t
c370: 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b  ype = (eFileLock
c380: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f  ==SHARED_LOCK?F_
c390: 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a  RDLCK:F_WRLCK);.
c3a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
c3b0: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
c3c0: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
c3d0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
c3e0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
c3f0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c400: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
c410: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
c420: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
c430: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
c440: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c450: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
c460: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c470: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
c480: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
c490: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
c4a0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
c4b0: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
c4c0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
c4d0: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
c4e0: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
c4f0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
c500: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
c510: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
c520: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
c530: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c540: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c550: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
c560: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
c570: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
c580: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
c590: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
c5a0: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  _OK );..    /* N
c5b0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
c5c0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
c5d0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
c5e0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
c5f0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
c600: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75  _SIZE;.    if( u
c610: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
c620: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
c630: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
c640: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
c650: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
c660: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
c670: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
c680: 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K);.    }..    /
c690: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
c6a0: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
c6b0: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
c6c0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
c6d0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
c6e0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
c6f0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
c700: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  NLCK;.    if( un
c710: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
c720: 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d  , &lock) && rc==
c730: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c740: 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64     /* This could
c750: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e   happen with a n
c760: 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a  etwork mount */.
c770: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
c780: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
c790: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
c7a0: 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20  LOCK; .    }..  
c7b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c7c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c7d0: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
c7e0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c7f0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
c800: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
c810: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  nd_lock;.    }el
c820: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
c830: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
c840: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
c850: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
c860: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
c870: 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
c880: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
c890: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
c8a0: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
c8b0: 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
c8c0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
c8d0: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
c8e0: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
c8f0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
c900: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
c910: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
c920: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
c930: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
c940: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
c950: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
c960: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
c970: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
c980: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
c990: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
c9a0: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
c9b0: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
c9c0: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
c9d0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
c9e0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
c9f0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
ca00: 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
ca10: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  Lock );.    lock
ca20: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
ca30: 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  K;..    assert( 
ca40: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
ca50: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  VED_LOCK || eFil
ca60: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
ca70: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28  _LOCK );.    if(
ca80: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
ca90: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
caa0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
cab0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
cac0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
cad0: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73  n = 1L;.    }els
cae0: 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  e{.      lock.l_
caf0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
cb00: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
cb10: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
cb20: 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  SIZE;.    }..   
cb30: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
cb40: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
cb50: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
cb60: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
cb70: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
cb80: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
cb90: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
cba0: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
cbb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
cbc0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
cbd0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
cbe0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
cbf0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a  }.    }.  }.  ..
cc00: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
cc10: 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74   /* Set up the t
cc20: 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74  ransaction-count
cc30: 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69  er change checki
cc40: 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20  ng flags when.  
cc50: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  ** transitioning
cc60: 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74   from a SHARED t
cc70: 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  o a RESERVED loc
cc80: 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20  k.  The change. 
cc90: 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20   ** from SHARED 
cca0: 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b  to RESERVED mark
ccb0: 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  s the beginning 
ccc0: 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a  of a normal.  **
ccd0: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
cce0: 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72   (not a hot jour
ccf0: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20  nal rollback).. 
cd00: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
cd10: 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46  LITE_OK.   && pF
cd20: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
cd30: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26  SHARED_LOCK.   &
cd40: 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  & eFileLock==RES
cd50: 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a  ERVED_LOCK.  ){.
cd60: 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
cd70: 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20  CntrChng = 0;.  
cd80: 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
cd90: 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
cda0: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
cdb0: 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 1;.  }.#endif.
cdc0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
cdd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
cde0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
cdf0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
ce00: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
ce10: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
ce20: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
ce30: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
ce40: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
ce50: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
ce60: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
ce70: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
ce80: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
ce90: 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a  ;.  }..end_lock:
cea0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
ceb0: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
cec0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
ced0: 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  s (unix)\n", pFi
cee0: 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
cef0: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
cf00: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
cf10: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
cf20: 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
cf30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
cf40: 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  d the file descr
cf50: 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69  iptor used by fi
cf60: 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20  le handle pFile 
cf70: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
cf80: 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20  ding.** pUnused 
cf90: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
cfa0: 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46  void setPendingF
cfb0: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
cfc0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
cfd0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
cfe0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
cff0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d  nixUnusedFd *p =
d000: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b   pFile->pUnused;
d010: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49  .  p->pNext = pI
d020: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  node->pUnused;. 
d030: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
d040: 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68   = p;.  pFile->h
d050: 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e   = -1;.  pFile->
d060: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
d070: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
d080: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
d090: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d0a0: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
d0b0: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
d0c0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
d0d0: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
d0e0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
d0f0: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
d100: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
d110: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
d120: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
d130: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
d140: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
d150: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
d160: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
d170: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
d180: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
d190: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
d1a0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
d1b0: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
d1c0: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
d1d0: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
d1e0: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
d1f0: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
d200: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
d210: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
d220: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
d230: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
d240: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
d250: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
d260: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
d270: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
d280: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
d290: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
d2a0: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
d2b0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
d2c0: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
d2d0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
d2e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
d2f0: 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c   posixUnlock(sql
d300: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
d310: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e  nt eFileLock, in
d320: 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  t handleNFSUnloc
d330: 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  k){.  unixFile *
d340: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
d350: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
d360: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
d370: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
d380: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
d390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
d3a0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
d3b0: 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
d3c0: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
d3d0: 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %d,%d) pid=%d (u
d3e0: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
d3f0: 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
d400: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
d410: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
d420: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ode->eFileLock, 
d430: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
d440: 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65  Shared,.      ge
d450: 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73  tpid()));..  ass
d460: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
d470: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
d480: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
d490: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
d4a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d4b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
d4c0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
d4d0: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
d4e0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
d4f0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
d500: 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
d510: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
d520: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
d530: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
d540: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d550: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
d560: 6b 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  k );..#ifndef ND
d570: 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
d580: 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
d590: 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
d5a0: 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
d5b0: 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
d5c0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
d5d0: 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
d5e0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
d5f0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
d600: 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
d610: 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
d620: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
d630: 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
d640: 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
d650: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
d660: 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
d670: 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
d680: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
d690: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
d6a0: 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
d6b0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
d6c0: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
d6d0: 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
d6e0: 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
d6f0: 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
d700: 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
d710: 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
d720: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
d730: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
d740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69  ..    */.    pFi
d750: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
d760: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
d770: 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
d780: 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
d790: 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
d7a0: 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
d7b0: 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
d7c0: 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
d7d0: 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
d7e0: 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
d7f0: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
d800: 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
d810: 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
d820: 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
d830: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
d840: 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
d850: 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
d860: 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
d870: 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
d880: 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
d890: 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
d8a0: 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
d8b0: 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
d8c0: 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
d8d0: 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
d8e0: 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
d8f0: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
d900: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
d910: 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  {..#if !defined(
d920: 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
d930: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
d940: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
d950: 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
d960: 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
d970: 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
d980: 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
d990: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
d9a0: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
d9b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
d9c0: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
d9d0: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
d9e0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
d9f0: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
da00: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
da10: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
da20: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
da30: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
da40: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
da50: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
da60: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
da70: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
da80: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
da90: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
daa0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
dab0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
dac0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
dad0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
dae0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
daf0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
db00: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
db10: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
db20: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
db30: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
db40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
db50: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  OCK;.          i
db60: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
db70: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
db80: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
db90: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
dba0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dbb0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
dbc0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
dbd0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
dbe0: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
dbf0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
dc00: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
dc10: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
dc20: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
dc30: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
dc40: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
dc50: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
dc60: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
dc70: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
dc80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
dc90: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
dca0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
dcb0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
dcc0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
dcd0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
dce0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
dcf0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
dd00: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
dd10: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
dd20: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
dd30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dd40: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
dd50: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
dd60: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
dd70: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
dd80: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
dd90: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
dda0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
ddb0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
ddc0: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
ddd0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
dde0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
ddf0: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
de00: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
de10: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
de20: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
de30: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
de40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
de50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
de60: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
de70: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
de80: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
de90: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
dea0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
deb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dec0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
ded0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
dee0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
def0: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
df00: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
df10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
df20: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
df30: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
df40: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
df50: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
df60: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
df70: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
df80: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
df90: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
dfa0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
dfb0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
dfc0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
dfd0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
dfe0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
dff0: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
e000: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
e010: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
e020: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
e030: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
e040: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
e050: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
e060: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
e070: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
e080: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
e090: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
e0a0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
e0b0: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
e0c0: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
e0d0: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
e0e0: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
e0f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
e100: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
e110: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
e120: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
e130: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
e140: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
e150: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
e160: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
e170: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
e180: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
e190: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e1a0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
e1b0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e1c0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
e1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
e1e0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
e1f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e200: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
e210: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
e220: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e230: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e240: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e250: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
e260: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e270: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
e280: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
e290: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
e2a0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e2b0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e2c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
e2d0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
e2e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
e2f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
e300: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
e310: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  _UNLOCK;.      p
e320: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
e330: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67  = errno;.      g
e340: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
e350: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e360: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
e370: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
e380: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
e390: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
e3a0: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
e3b0: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
e3c0: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
e3d0: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
e3e0: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
e3f0: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
e400: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
e410: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
e420: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
e430: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
e440: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
e450: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
e460: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
e470: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
e480: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
e490: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e4a0: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
e4b0: 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  L;.      if( uni
e4c0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
e4d0: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
e4e0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
e4f0: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
e500: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
e510: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e520: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e530: 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  ;..pFile->lastEr
e540: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e550: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
e560: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
e570: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
e580: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
e590: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
e5a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
e5b0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
e5c0: 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
e5d0: 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
e5e0: 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
e5f0: 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
e600: 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
e610: 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
e620: 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
e630: 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
e640: 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
e650: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
e660: 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
e670: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
e680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
e690: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
e6a0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
e6b0: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
e6c0: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
e6d0: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
e6e0: 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63  .  }...end_unloc
e6f0: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
e700: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
e710: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
e720: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
e730: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
e740: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e750: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
e760: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
e770: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
e780: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
e790: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
e7a0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
e7b0: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
e7c0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
e7d0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
e7e0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
e7f0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
e800: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
e810: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
e820: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
e830: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
e840: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
e850: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
e860: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e870: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
e880: 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
e890: 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
e8a0: 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Lock, 0);.}../*.
e8b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e8c0: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
e8d0: 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
e8e0: 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
e8f0: 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
e900: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
e910: 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
e920: 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
e930: 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
e940: 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
e950: 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
e960: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
e970: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
e980: 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
e990: 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
e9a0: 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
e9b0: 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
e9c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e9d0: 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
e9e0: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
e9f0: 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
ea00: 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
ea10: 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
ea20: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
ea30: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
ea40: 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
ea50: 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
ea60: 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
ea70: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
ea80: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
ea90: 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
eaa0: 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
eab0: 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
eac0: 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
ead0: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
eae0: 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
eaf0: 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
eb00: 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
eb10: 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20  pFile->isDelete 
eb20: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
eb30: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
eb40: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
eb50: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
eb60: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
eb70: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
eb80: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
eb90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
eba0: 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
ebb0: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
ebc0: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
ebd0: 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
ebe0: 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
ebf0: 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
ec00: 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
ec10: 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
ec20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ec30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ec40: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
ec50: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
ec60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
ec70: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
ec80: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
ec90: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
eca0: 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e  xFile *)id;.  un
ecb0: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
ecc0: 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
ecd0: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
ece0: 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65   unixFile.pInode
ecf0: 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
ed00: 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65   here. Otherwise
ed10: 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c  , a different cl
ed20: 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ose.  ** routine
ed30: 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f   (e.g. nolockClo
ed40: 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63  se()) would be c
ed50: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20  alled instead.. 
ed60: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
ed70: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
ed80: 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  ck>0 || pFile->p
ed90: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
eda0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ock==0 );.  if( 
edb0: 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49  ALWAYS(pFile->pI
edc0: 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e  node) && pFile->
edd0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
ede0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
edf0: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
ee00: 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
ee10: 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
ee20: 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
ee30: 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
ee40: 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
ee50: 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
ee60: 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
ee70: 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
ee80: 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
ee90: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
eea0: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
eeb0: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
eec0: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
eed0: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
eee0: 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
eef0: 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
ef00: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
ef10: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
ef20: 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ile);.  rc = clo
ef30: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
ef40: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
ef50: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
ef60: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
ef70: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
ef80: 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
ef90: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
efa0: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
efb0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
efc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f000: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
f010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f050: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
f060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f070: 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
f080: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
f090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0a0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
f0b0: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
f0c0: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
f0d0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
f0e0: 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
f0f0: 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
f100: 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
f110: 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
f120: 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
f130: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
f140: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
f150: 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
f160: 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
f170: 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
f180: 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
f190: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
f1a0: 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
f1b0: 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
f1c0: 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
f1d0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
f1e0: 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
f1f0: 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
f200: 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
f210: 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
f220: 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
f230: 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
f240: 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
f250: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
f260: 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
f270: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
f280: 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
f290: 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
f2a0: 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
f2b0: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
f2c0: 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
f2d0: 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
f2e0: 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
f2f0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
f300: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
f310: 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
f320: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
f330: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
f340: 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
f350: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
f360: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
f370: 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
f380: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f390: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
f3a0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f3b0: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
f3c0: 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
f3d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
f3e0: 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
f3f0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
f400: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
f410: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
f420: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f430: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
f440: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
f450: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
f460: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
f470: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f480: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
f490: 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
f4a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
f4b0: 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
f4c0: 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
f4d0: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
f4e0: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
f4f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f500: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
f510: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
f520: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
f530: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
f540: 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
f550: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
f560: 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
f570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
f580: 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
f590: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5b0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
f5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f600: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
f610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f650: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
f660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f670: 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
f680: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
f690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6a0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
f6b0: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
f6c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f6d0: 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61 6e  uses the existan
f6e0: 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
f6f0: 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20  ock.** files in 
f700: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c  order to control
f710: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
f720: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77  atabase.  This w
f730: 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20  orks on just.** 
f740: 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65  about every file
f750: 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c  system imaginabl
f760: 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
f770: 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69  e serious downsi
f780: 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  des:.**.**    (1
f790: 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f  )  There is zero
f7a0: 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41   concurrency.  A
f7b0: 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62   single reader b
f7c0: 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a  locks all other.
f7d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  **         conne
f7e0: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64  ctions from read
f7f0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
f800: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
f810: 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70  **    (2)  An ap
f820: 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20  plication crash 
f830: 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61  or power loss ca
f840: 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f  n leave stale lo
f850: 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20  ck files.**     
f860: 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75      sitting arou
f870: 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  nd that need to 
f880: 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61  be cleared manua
f890: 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72  lly..**.** Never
f8a0: 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f  theless, a dotlo
f8b0: 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72  ck is an appropr
f8c0: 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  iate locking mod
f8d0: 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a  e for use if no.
f8e0: 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
f8f0: 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61   strategy is ava
f900: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  ilable..**.** Do
f910: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f  tfile locking wo
f920: 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  rks by creating 
f930: 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  a file in the sa
f940: 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
f950: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
f960: 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
f970: 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
f980: 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
f990: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
f9a0: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61  e existance of a
f9b0: 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69   lock file impli
f9c0: 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
f9d0: 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
f9e0: 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28   lock.** types (
f9f0: 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
fa00: 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
fa10: 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
fa20: 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
fa30: 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
fa40: 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
fa50: 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
fa60: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
fa70: 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66  te the.** lock f
fa80: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
fa90: 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22  DOTLOCK_SUFFIX "
faa0: 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  .lock"../*.** Th
fab0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
fac0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
fad0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
fae0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
faf0: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
fb00: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
fb10: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
fb20: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
fb30: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
fb40: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
fb50: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
fb60: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
fb70: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
fb80: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
fb90: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
fba0: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
fbb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
fbc0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
fbd0: 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66  g..**.** In dotf
fbe0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74  ile locking, eit
fbf0: 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74  her a lock exist
fc00: 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74  s or it does not
fc10: 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a  .  So in this.**
fc20: 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68   variation of Ch
fc30: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
fc40: 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  ), *pResOut is s
fc50: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e  et to true if an
fc60: 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c  y lock.** is hel
fc70: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  d on the file an
fc80: 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66  d false if the f
fc90: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
fca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
fcb0: 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
fcc0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
fcd0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
fce0: 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
fcf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fd00: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
fd10: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
fd20: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
fd30: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
fd40: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
fd50: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
fd60: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
fd70: 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
fd80: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
fd90: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
fda0: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
fdb0: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
fdc0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
fdd0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
fde0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
fdf0: 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73    /* Either this
fe00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73   connection or s
fe10: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
fe20: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65  tion in the same
fe30: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
fe40: 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20  holds a lock on 
fe50: 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65  the file.  No ne
fe60: 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74  ed to check furt
fe70: 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65  her. */.    rese
fe80: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  rved = 1;.  }els
fe90: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  e{.    /* The lo
fea0: 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e  ck is held if an
feb0: 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f  d only if the lo
fec0: 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  ckfile exists */
fed0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fee0: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f  *zLockFile = (co
fef0: 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d  nst char*)pFile-
ff00: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
ff10: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
ff20: 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69  osAccess(zLockFi
ff30: 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20  le, 0)==0;.  }. 
ff40: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
ff50: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
ff60: 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
ff70: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
ff80: 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73  erved));.  *pRes
ff90: 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
ffa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ffb0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
ffc0: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
ffd0: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
ffe0: 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
fff0: 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
10000 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
10010 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
10020 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
10030 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
10040 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
10050 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
10060 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
10070 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
10080 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
10090 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
100a0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
100b0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
100c0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
100d0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
100e0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
100f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
10100 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
10110 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
10120 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
10130 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
10140 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
10150 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
10160 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
10170 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
10180 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
10190 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
101a0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
101b0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
101c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
101d0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
101e0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
101f0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
10200 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
10210 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
10220 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
10230 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
10240 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
10250 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
10260 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
10270 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
10280 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
10290 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
102a0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
102b0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
102c0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
102d0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
102e0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
102f0 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
10300 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
10310 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
10320 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
10330 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
10340 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
10350 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10360 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
10370 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
10380 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
10390 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
103a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
103b0 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20   int fd;.  char 
103c0 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
103d0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
103e0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
103f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10400 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
10410 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
10420 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
10430 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
10440 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
10450 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
10460 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
10470 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
10480 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
10490 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
104a0 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
104b0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
104c0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
104d0 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
104e0 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
104f0 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
10500 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
10510 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
10520 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
10530 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
10540 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
10550 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
10560 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
10570 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10580 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
10590 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
105a0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
105b0 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44  n(zLockFile,O_RD
105c0 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  ONLY|O_CREAT|O_E
105d0 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28  XCL,0600);.  if(
105e0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   fd<0 ){.    /* 
105f0 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
10600 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20  reate the file, 
10610 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79  someone else may
10620 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65   have stolen the
10630 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
10640 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10650 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
10660 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
10670 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
10680 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
10690 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
106a0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
106b0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
106c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
106d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
106e0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
106f0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
10700 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10710 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
10720 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
10730 3b 0a 20 20 7d 20 0a 20 20 72 6f 62 75 73 74 5f  ;.  } .  robust_
10740 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c  close(pFile, fd,
10750 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20   __LINE__);.  . 
10760 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
10770 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
10780 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
10790 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
107a0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
107b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
107c0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
107d0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
107e0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
107f0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
10800 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
10810 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
10820 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
10830 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10840 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10850 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
10860 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10870 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10880 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10890 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
108a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
108b0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
108c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
108d0 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
108e0 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
108f0 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
10900 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
10910 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10920 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
10930 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
10940 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10950 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
10960 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
10970 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
10980 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
10990 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
109a0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
109b0 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
109c0 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c   %d pid=%d (dotl
109d0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
109e0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20  h, eFileLock,.. 
109f0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10a00 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
10a10 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
10a20 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
10a30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
10a40 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
10a50 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
10a60 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
10a70 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
10a80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10a90 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
10aa0 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
10ab0 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
10ac0 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
10ad0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
10ae0 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
10af0 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
10b00 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
10b10 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
10b20 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
10b30 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
10b40 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10b50 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
10b60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10b70 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
10b80 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
10b90 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
10ba0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
10bb0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
10bc0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
10bd0 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28  .  if( osUnlink(
10be0 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20  zLockFile) ){.  
10bf0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
10c00 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
10c10 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e  rrno;.    if( EN
10c20 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29  OENT != tErrno )
10c30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10c40 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10c60 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10c70 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
10c80 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10c90 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
10ca0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
10cb0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10cc0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
10cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
10cf0 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
10d00 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
10d10 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
10d20 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
10d30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10d40 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
10d50 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
10d60 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64  int rc;.  if( id
10d70 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
10d80 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10d90 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74  ile*)id;.    dot
10da0 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
10db0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c  O_LOCK);.    sql
10dc0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
10dd0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
10de0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f  ;.  }.  rc = clo
10df0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
10e00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f    return rc;.}./
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f  ** End of the do
10e30 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c  t-file lock impl
10e40 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
10eb0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
10ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
10f20 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a   flock Locking *
10f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10f50 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c  **.** Use the fl
10f60 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ock() system cal
10f70 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63  l to do file loc
10f80 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  king..**.** floc
10f90 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  k() locking is l
10fa0 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  ike dot-file loc
10fb0 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65  king in that the
10fc0 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65   various.** fine
10fd0 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c  -grain locking l
10fe0 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20  evels supported 
10ff0 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f  by SQLite are co
11000 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20  llapsed into.** 
11010 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69  a single exclusi
11020 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68  ve lock.  In oth
11030 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44  er words, SHARED
11040 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a  , RESERVED, and.
11050 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73  ** PENDING locks
11060 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68   are the same th
11070 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53  ing as an EXCLUS
11080 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74  IVE lock.  SQLit
11090 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73  e.** still works
110a0 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69   when you do thi
110b0 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e  s, but concurren
110c0 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69  cy is reduced si
110d0 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  nce.** only a si
110e0 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
110f0 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
11100 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69  database at a ti
11110 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74  me..**.** Omit t
11120 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53  his section if S
11130 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
11140 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75  KING_STYLE is tu
11150 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a  rned off or if.*
11160 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20  * compiling for 
11170 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20  VXWORKS..*/.#if 
11180 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
11190 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
111a0 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
111b0 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20  * Retry flock() 
111c0 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
111d0 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69  with EINTR.*/.#i
111e0 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69  fdef EINTR.stati
111f0 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f  c int robust_flo
11200 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ck(int fd, int o
11210 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
11220 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66  do{ rc = flock(f
11230 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72  d,op); }while( r
11240 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
11250 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
11260 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
11270 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63  fine robust_floc
11280 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62  k(a,b) flock(a,b
11290 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a  ).#endif.     ..
112a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
112b0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
112c0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
112d0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
112e0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
112f0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
11300 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
11310 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
11320 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11330 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11340 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
11350 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11360 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
11370 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
11380 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
11390 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
113a0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
113b0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
113c0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
113d0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68  atic int flockCh
113e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
113f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11400 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
11410 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11420 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
11430 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
11440 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11450 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11460 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11470 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
11480 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
11490 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
114a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
114b0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   );.  .  /* Chec
114c0 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
114d0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
114e0 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
114f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
11500 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
11510 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
11520 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
11530 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
11540 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
11550 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
11560 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
11570 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
11580 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
11590 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
115a0 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73   int lrc = robus
115b0 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
115c0 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
115d0 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c  _NB);.    if( !l
115e0 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67  rc ){.      /* g
115f0 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c  ot the lock, unl
11600 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ock it */.      
11610 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
11620 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
11630 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20  K_UN);.      if 
11640 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20  ( lrc ) {.      
11650 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11660 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rrno;.        /*
11670 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77   unlock failed w
11680 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ith an error */.
11690 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51          lrc = SQ
116a0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
116b0 4b 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  K; .        if( 
116c0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
116d0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
116e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
116f0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
11700 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
11710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11720 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
11730 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
11740 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
11750 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
11760 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
11770 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
11780 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
11790 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
117a0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
117b0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
117c0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20  _IOERR_LOCK); . 
117d0 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
117e0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
117f0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
11800 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
11810 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
11820 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
11830 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
11840 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
11850 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c  d %d %d (flock)\
11860 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
11870 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23  , reserved));..#
11880 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
11890 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
118a0 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
118b0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
118c0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
118d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
118e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
118f0 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
11900 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
11910 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
11920 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
11930 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11950 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11960 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
11970 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
11980 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
11990 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
119a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
119b0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
119c0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
119d0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
119e0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
119f0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
11a00 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11a10 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11a20 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11a30 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11a40 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11a50 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11a60 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11a70 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11a80 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
11a90 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
11aa0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11ab0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11ac0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11ad0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
11ae0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11af0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11b00 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11b10 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11b20 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11b30 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11b40 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11b50 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11b60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11b70 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11b80 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11b90 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11ba0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11bb0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11bc0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11bd0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11be0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11bf0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11c00 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
11c10 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
11c20 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
11c30 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
11c40 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
11c50 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
11c60 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
11c70 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
11c80 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
11c90 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
11ca0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
11cb0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
11cc0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
11cd0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
11ce0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
11cf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11d00 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
11d10 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
11d20 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
11d30 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
11d40 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
11d50 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
11d60 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
11d70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11d80 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11d90 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
11da0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11db0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11dc0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11dd0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11de0 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
11df0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
11e00 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
11e10 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
11e20 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
11e30 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
11e40 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
11e50 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
11e60 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
11e70 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11e80 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11e90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11ea0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
11eb0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
11ec0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
11ed0 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
11ee0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
11ef0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
11f00 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
11f10 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
11f20 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
11f30 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
11f40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
11f50 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11f60 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11f70 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
11f80 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
11f90 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
11fa0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11fb0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
11fc0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
11fd0 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
11fe0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
11ff0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
12000 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
12010 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
12020 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
12030 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
12040 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12050 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
12060 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
12070 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
12080 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
12090 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
120a0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
120b0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
120c0 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
120d0 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
120e0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
120f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
12100 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
12110 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12120 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
12130 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
12140 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
12150 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
12160 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
12170 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
12180 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
12190 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
121a0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
121b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
121c0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
121d0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
121e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
121f0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
12200 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
12210 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
12220 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
12230 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
12240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
12250 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
12260 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12270 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
12280 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12290 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
122a0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
122b0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
122c0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
122d0 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
122e0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
122f0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
12300 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
12310 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
12320 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
12330 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
12340 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12350 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
12360 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
12370 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
12380 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
12390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
123a0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
123b0 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
123c0 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
123d0 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
123e0 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
123f0 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
12400 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
12410 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12420 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
12430 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12440 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
12450 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
12460 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lock. */.  if( r
12470 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
12480 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29  e->h, LOCK_UN) )
12490 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
124a0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
124b0 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74  K_ERRORS.    ret
124c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
124d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
124e0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
124f0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
12500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12510 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65  ERR_UNLOCK;.  }e
12520 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
12530 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
12540 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
12550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
12560 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
12570 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
12580 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
12590 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
125a0 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
125b0 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
125c0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  d, NO_LOCK);.  }
125d0 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
125e0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
125f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12600 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
12610 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
12620 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
12640 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
12650 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
12660 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
12670 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126c0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12710 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12730 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
12740 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
12750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12760 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
12770 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
12780 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
12790 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
127a0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
127b0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
127c0 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
127d0 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
127e0 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
127f0 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
12800 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
12810 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
12820 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
12830 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
12840 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
12850 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
12860 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
12870 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
12880 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
12890 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
128a0 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
128b0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
128c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
128d0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
128e0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
128f0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
12900 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
12910 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
12920 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
12930 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
12940 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
12950 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
12960 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
12970 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
12980 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
12990 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
129a0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
129b0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
129c0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
129d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
129e0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
129f0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65  tatic int semChe
12a00 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
12a10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12a20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
12a30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12a40 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
12a50 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
12a60 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12a70 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
12a80 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12a90 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12aa0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
12ab0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
12ac0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12ad0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
12ae0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
12af0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
12b00 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
12b10 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
12b20 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
12b30 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
12b40 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
12b50 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
12b60 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
12b70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
12b80 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
12b90 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
12ba0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
12bb0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
12bc0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
12bd0 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20  atBuf;..    if( 
12be0 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
12bf0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
12c00 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12c10 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
12c20 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
12c30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12c40 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
12c50 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12c60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
12c70 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
12c80 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
12c90 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
12ca0 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  no;.      } else
12cb0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
12cc0 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
12cd0 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
12ce0 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
12cf0 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
12d00 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
12d10 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
12d20 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
12d30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12d40 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
12d50 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
12d60 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
12d70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
12d80 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
12d90 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12da0 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
12db0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
12dc0 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
12dd0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
12de0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
12df0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
12e00 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
12e10 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
12e20 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
12e30 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
12e40 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
12e50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
12e60 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
12e70 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
12e80 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
12e90 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
12ea0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
12eb0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
12ec0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
12ed0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
12ee0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
12ef0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
12f00 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
12f10 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
12f20 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
12f30 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
12f40 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
12f50 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
12f60 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
12f70 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
12f80 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
12f90 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
12fa0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
12fb0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
12fc0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
12fd0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12fe0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
12ff0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
13000 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
13010 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
13020 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13030 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
13040 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
13050 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13060 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
13070 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
13080 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
13090 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
130a0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
130b0 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
130c0 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
130d0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
130e0 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
130f0 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
13100 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
13110 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
13120 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
13130 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
13140 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
13150 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
13160 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
13170 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
13180 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
13190 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
131a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
131b0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
131c0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
131d0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
131e0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
131f0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
13200 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
13210 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
13220 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13230 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
13240 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13250 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13260 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
13270 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
13280 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
13290 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
132a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
132b0 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
132c0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
132d0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
132e0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
132f0 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
13300 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
13310 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
13320 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
13330 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
13340 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13350 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
13360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
13370 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
13380 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
13390 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
133a0 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
133b0 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
133c0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
133d0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
133e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
133f0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
13400 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
13410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
13420 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
13430 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
13440 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13450 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13460 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
13470 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13480 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
13490 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
134a0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
134b0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
134c0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
134d0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
134e0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
134f0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
13500 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
13510 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
13520 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13530 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
13540 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
13550 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
13560 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
13570 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13580 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
13590 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
135a0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
135b0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
135c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
135d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
135e0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
135f0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
13600 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
13620 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
13630 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
13640 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
13650 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
13660 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20  , eFileLock,..  
13670 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13680 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
13690 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
136a0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
136b0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
136c0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
136d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
136e0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
136f0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
13700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13710 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
13720 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
13730 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
13740 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
13750 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
13760 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
13770 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
13780 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
13790 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
137a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
137b0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
137c0 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
137d0 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
137e0 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
137f0 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
13800 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
13810 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13820 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13830 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13840 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
13850 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
13860 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
13870 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
13880 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
13890 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
138a0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
138b0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
138c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
138d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
138e0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
138f0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
13900 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
13910 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
13920 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
13930 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13940 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
13950 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
13960 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
13970 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
13980 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
13990 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
139a0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
139b0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
139c0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
139d0 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
139e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
139f0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
13a00 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a  S_VXWORKS */./*.
13a10 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
13a20 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
13a30 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
13a40 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  VxWorks..**.****
13a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
13a60 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  of the named sem
13a70 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c  aphore lock impl
13a80 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
13a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
13af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
13b60 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  AFP Locking ****
13b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13b90 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41  .** AFP is the A
13ba0 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74  pple Filing Prot
13bb0 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20  ocol.  AFP is a 
13bc0 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74  network filesyst
13bd0 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41  em found.** on A
13be0 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63  pple Macintosh c
13bf0 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20  omputers - both 
13c00 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a  OS9 and OSX..**.
13c10 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69  ** Third-party i
13c20 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
13c30 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61  f AFP are availa
13c40 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63  ble.  But this c
13c50 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79  ode here.** only
13c60 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a   works on OSX..*
13c70 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
13c80 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
13c90 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
13ca0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
13cb0 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
13cc0 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
13cd0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
13ce0 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
13cf0 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
13d00 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
13d10 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
13d20 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
13d30 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
13d40 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65  ext {.  int rese
13d50 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rved;.  const ch
13d60 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
13d70 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
13d80 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
13d90 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42   */.};..struct B
13da0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
13db0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
13dc0 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
13dd0 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
13de0 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
13df0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
13e00 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
13e10 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
13e20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
13e30 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
13e40 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
13e50 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
13e60 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
13e70 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
13e80 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
13e90 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
13ea0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
13eb0 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
13ec0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
13ed0 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
13ee0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
13ef0 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
13f00 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
13f10 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
13f40 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
13f50 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
13f60 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
13f70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
13f80 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
13f90 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
13fa0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
13fb0 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PB2)../*.** This
13fc0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f   is a utility fo
13fd0 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65  r setting or cle
13fe0 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67  aring a bit-rang
13ff0 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20  e lock on an.** 
14000 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  AFP filesystem..
14010 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  ** .** Return SQ
14020 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
14030 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
14040 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
14050 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74  tatic int afpSet
14060 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
14070 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
14080 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
14090 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
140a0 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63   locked or unloc
140b0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ked */.  unixFil
140c0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
140d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
140e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
140f0 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73  on path */.  uns
14100 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14110 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46  offset,     /* F
14120 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
14130 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69  locked */.  unsi
14140 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
14150 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75  ength,     /* Nu
14160 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
14170 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73   lock */.  int s
14180 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20  etLockFlag      
14190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
141a0 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20  e to set lock.  
141b0 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c  False to clear l
141c0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
141d0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
141e0 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72  PB2 pb;.  int er
141f0 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
14200 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
14210 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
14220 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
14230 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
14240 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
14250 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
14260 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
14270 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43  ->h;.  .  OSTRAC
14280 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b  E(("AFPSETLOCK [
14290 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20  %s] for %d%s in 
142a0 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
142b0 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
142c0 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
142d0 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62  ), pFile->h, (pb
142e0 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61  .fd==-1?"[testva
142f0 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f  l-1]":""),.    o
14300 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b  ffset, length));
14310 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
14320 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
14330 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
14340 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
14350 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
14360 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
14370 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
14380 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50     OSTRACE(("AFP
14390 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
143a0 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
143b0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
143c0 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
143d0 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
143e0 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53  rno)));.#ifdef S
143f0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
14400 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
14410 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14420 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
14430 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
14440 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
14450 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
14460 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
14470 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
14480 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
14490 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
144a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
144b0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
144c0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
144d0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
144e0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
144f0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14500 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
14510 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14520 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
14530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14540 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
14550 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
14560 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
14570 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
14580 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
14590 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
145a0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
145b0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
145c0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
145d0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
145e0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
145f0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
14600 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
14610 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
14620 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
14630 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
14640 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
14650 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14660 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
14670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
14680 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
14690 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
146a0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
146b0 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
146c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
146d0 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
146e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
146f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14700 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
14710 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a  ntext *context;.
14720 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
14730 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
14740 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
14750 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
14760 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
14770 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20  le );.  context 
14780 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
14790 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
147a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
147b0 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65   if( context->re
147c0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70  served ){.    *p
147d0 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  ResOut = 1;.    
147e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
147f0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
14800 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
14810 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
14820 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
14830 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  oss threads */. 
14840 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
14850 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
14860 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
14870 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
14880 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
14890 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
148a0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
148b0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
148c0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
148d0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
148e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
148f0 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
14900 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
14910 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
14920 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
14930 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
14940 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
14950 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
14960 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
14970 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
14980 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
14990 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
149a0 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
149b0 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
149c0 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
149d0 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
149e0 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
149f0 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
14a00 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
14a10 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
14a20 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
14a30 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
14a40 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
14a50 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
14a60 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
14a70 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
14a80 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
14a90 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
14aa0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
14ab0 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
14ac0 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
14ad0 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
14ae0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
14af0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
14b00 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
14b10 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
14b20 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
14b30 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
14b40 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  d));.  .  *pResO
14b50 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
14b60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14b70 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
14b80 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
14b90 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
14ba0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
14bb0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
14bc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
14bd0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
14be0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
14bf0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
14c00 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
14c10 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
14c20 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
14c30 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
14c40 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
14c50 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
14c60 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
14c70 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
14c80 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
14c90 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
14ca0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
14cb0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
14cc0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14cd0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
14ce0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
14cf0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
14d00 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
14d10 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
14d20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
14d30 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
14d40 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
14d50 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
14d60 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
14d70 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
14d80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
14d90 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
14da0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
14db0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
14dc0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
14dd0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14de0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
14df0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14e00 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
14e10 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
14e20 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
14e30 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
14e40 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
14e50 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
14e60 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
14e70 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
14e80 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
14e90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
14ea0 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
14eb0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
14ec0 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
14ed0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14ee0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14ef0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14f00 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
14f10 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
14f20 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c  ->pInode;.  afpL
14f30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
14f40 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
14f50 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
14f60 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
14f70 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72  text;.  .  asser
14f80 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
14f90 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
14fa0 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
14fb0 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
14fc0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
14fd0 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
14fe0 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
14ff0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
15000 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
15010 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
15020 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69  Lock(pInode->eFi
15030 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d  leLock), pInode-
15040 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69  >nShared , getpi
15050 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  d()));..  /* If 
15060 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
15070 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
15080 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
15090 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
150a0 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
150b0 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
150c0 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
150d0 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
150e0 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
150f0 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
15100 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
15110 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
15120 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
15130 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
15140 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
15150 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
15160 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29  eady held) (afp)
15170 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
15180 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
15190 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
151a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
151b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
151c0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
151d0 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
151e0 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
151f0 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
15200 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
15210 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
15220 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
15230 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
15240 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
15250 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
15260 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
15270 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
15280 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
15290 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
152a0 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
152b0 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
152c0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
152d0 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
152e0 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
152f0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
15300 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
15310 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
15320 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
15330 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
15340 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
15350 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
15360 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
15370 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
15380 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
15390 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
153a0 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
153b0 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
153c0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
153d0 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
153e0 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
153f0 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
15400 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
15410 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
15420 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
15430 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
15440 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
15450 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
15460 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
15470 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
15480 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
15490 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
154a0 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e   && .       (pIn
154b0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
154c0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
154d0 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
154e0 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a  _LOCK)).     ){.
154f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15500 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61  BUSY;.    goto a
15510 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
15520 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48  .  .  /* If a SH
15530 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
15540 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
15550 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
15560 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
15570 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
15580 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
15590 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
155a0 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
155b0 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
155c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
155d0 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
155e0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
155f0 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65  && .     (pInode
15600 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
15610 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
15620 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
15630 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
15640 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
15650 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15660 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
15670 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
15680 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
15690 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
156a0 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
156b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
156c0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
156d0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
156e0 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
156f0 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
15700 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
15710 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
15720 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
15730 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
15740 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
15750 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
15760 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
15770 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
15780 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
15790 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
157a0 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
157b0 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
157c0 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
157d0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
157e0 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
157f0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
15800 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
15810 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
15820 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
15830 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  int failed;.    
15840 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
15850 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
15860 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
15870 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b  ING_BYTE, 1, 1);
15880 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
15890 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61   {.      rc = fa
158a0 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f  iled;.      goto
158b0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
158c0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
158d0 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
158e0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
158f0 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
15900 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
15910 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
15920 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
15930 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
15940 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
15950 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
15960 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
15970 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63   lrc1, lrc2, lrc
15980 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  1Errno = 0;.    
15990 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20  long lk, mask;. 
159a0 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20     .    assert( 
159b0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
159c0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
159d0 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
159e0 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
159f0 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73    .    mask = (s
15a00 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20  izeof(long)==8) 
15a10 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  ? LARGEST_INT64 
15a20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  : 0x7fffffff;.  
15a30 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
15a40 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
15a50 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
15a60 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
15a70 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
15a80 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
15a90 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
15aa0 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
15ab0 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e  ndom(); .    pIn
15ac0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20  ode->sharedByte 
15ad0 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53  = (lk & mask)%(S
15ae0 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
15af0 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53  .    lrc1 = afpS
15b00 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15b10 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
15b20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15b30 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
15b40 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
15b50 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
15b60 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
15b70 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
15b80 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
15b90 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
15ba0 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
15bb0 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
15bc0 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
15bd0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15be0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15bf0 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
15c00 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
15c10 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15c20 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
15c30 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15c40 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
15c50 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
15c60 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15c70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15c80 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
15c90 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
15ca0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
15cb0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15cc0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15cd0 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
15ce0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
15cf0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
15d00 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15d10 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15d20 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
15d30 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
15d40 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
15d50 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
15d60 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
15d70 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
15d80 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
15d90 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
15da0 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
15db0 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
15dc0 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
15dd0 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
15de0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
15df0 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
15e00 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
15e10 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
15e20 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
15e30 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
15e40 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
15e50 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
15e60 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
15e70 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
15e80 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
15e90 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
15ea0 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
15eb0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
15ec0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
15ed0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
15ee0 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
15ef0 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
15f00 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
15f10 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
15f20 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
15f30 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
15f40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
15f50 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
15f60 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
15f70 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
15f80 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
15f90 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
15fa0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15fb0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
15fc0 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
15fd0 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
15fe0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
15ff0 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
16000 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
16010 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
16020 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
16030 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
16040 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
16050 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
16060 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
16070 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
16080 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
16090 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
160a0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
160b0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
160c0 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
160d0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
160e0 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
160f0 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
16100 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
16110 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
16120 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16130 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16140 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
16170 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
16180 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
16190 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
161a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
161b0 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
161c0 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
161d0 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
161e0 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
161f0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
16200 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16210 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
16220 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
16250 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
16260 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
16270 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
16280 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16290 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162b0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
162c0 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
162d0 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
162e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
162f0 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
16300 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
16310 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
16320 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
16330 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
16340 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
16350 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16360 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
16370 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  d & SQLITE_IOERR
16380 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
16390 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
163b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
163c0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
163d0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
163e0 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
163f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
16400 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
16410 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16420 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
16430 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
16440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
16450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16460 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
16470 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
16480 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
16490 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
164a0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
164b0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
164c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
164d0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
164e0 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
164f0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
16500 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
16510 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
16520 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
16530 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
16540 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
16550 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
16560 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
16570 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
16580 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
16590 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
165a0 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
165b0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
165c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
165d0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
165e0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
165f0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
16600 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
16610 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
16620 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
16630 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
16640 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
16650 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
16660 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
16670 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
16680 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
16690 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
166a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
166b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
166c0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
166d0 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
166e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
166f0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
16700 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16710 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
16720 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16730 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
16740 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
16750 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
16760 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
16770 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
16780 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
16790 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
167a0 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
167b0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
167c0 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
167d0 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
167e0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
167f0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
16800 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
16810 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
16820 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
16830 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
16840 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
16850 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16860 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
16870 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
16880 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
16890 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
168a0 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
168b0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
168c0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
168d0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
168e0 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
168f0 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
16900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16910 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
16920 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
16930 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
16940 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
16950 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
16960 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
16970 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
16980 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16990 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
169a0 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
169b0 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
169c0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
169d0 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
169e0 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
169f0 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
16a00 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
16a10 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44  .    .#ifndef ND
16a20 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
16a30 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
16a40 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
16a50 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
16a60 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
16a70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
16a80 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
16a90 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
16aa0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
16ab0 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
16ac0 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
16ad0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
16ae0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
16af0 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
16b00 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
16b10 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
16b20 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
16b30 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
16b40 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
16b50 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
16b60 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
16b70 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
16b80 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
16b90 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
16ba0 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
16bb0 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
16bc0 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
16bd0 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
16be0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
16bf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
16c00 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  ert( pFile->inNo
16c10 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20  rmalWrite==0.   
16c20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
16c30 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
16c40 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
16c50 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
16c60 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  ==1 );.    pFile
16c70 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
16c80 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
16c90 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
16ca0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
16cb0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
16cc0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
16cd0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16ce0 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
16cf0 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
16d00 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
16d10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16d20 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
16d30 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
16d40 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
16d50 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
16d60 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
16d70 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
16d80 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
16d90 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
16da0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
16db0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
16dc0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
16dd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
16de0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16df0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16e00 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
16e10 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20   1, 1);.      } 
16e20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
16e30 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  kipShared = 1;. 
16e40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16e50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16e60 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
16e70 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
16e80 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
16e90 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16ea0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16eb0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
16ec0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
16ed0 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
16ee0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
16ef0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53  ->eFileLock>=RES
16f00 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f  ERVED_LOCK && co
16f10 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
16f20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
16f30 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16f40 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16f50 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
16f60 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
16f70 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20   !rc ){ .       
16f80 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
16f90 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d  ed = 0; .      }
16fa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
16fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16fc0 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
16fd0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
16fe0 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a  e->nShared>1)){.
16ff0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
17000 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
17010 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
17020 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17030 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63  E_OK && eFileLoc
17040 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20  k==NO_LOCK ){.. 
17050 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
17060 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
17070 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
17080 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
17090 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
170a0 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
170b0 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
170c0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
170d0 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
170e0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
170f0 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
17100 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
17110 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
17120 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17130 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
17140 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17150 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
17160 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
17170 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  {.      Simulate
17180 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
17190 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
171a0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
171b0 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
171c0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
171d0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69  ;.      if( !ski
171e0 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  pShared ){.     
171f0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
17200 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17210 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
17220 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29  dLockByte, 1, 0)
17230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17240 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
17250 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
17260 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
17270 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
17280 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
17290 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
172a0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
172b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
172c0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
172d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
172e0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
172f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
17300 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
17310 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50  {.        closeP
17320 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
17330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17340 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
17350 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
17360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17370 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17380 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
17390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
173a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
173b0 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
173c0 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
173d0 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
173e0 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
173f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17400 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
17410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
17420 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
17430 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
17440 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
17450 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
17460 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
17470 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
17480 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
17490 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
174a0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
174b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
174c0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
174d0 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
174e0 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
174f0 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
17500 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
17510 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
17520 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
17530 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
17540 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
17550 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
17560 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
17570 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
17580 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
17590 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
175a0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
175b0 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
175c0 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
175d0 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
175e0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  }.    releaseIno
175f0 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
17600 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17610 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17620 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
17630 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
17640 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
17650 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
17660 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
17670 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
17680 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
17690 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
176a0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
176b0 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
176c0 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63  e is the AFP loc
176d0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
176e0 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
176f0 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
17700 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
17710 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
17720 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
17730 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
17740 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
17750 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63    If you don't c
17760 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63  ompile for a mac
17770 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78  , then the "unix
17780 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20  -afp".** VFS is 
17790 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  not available..*
177a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
177b0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
177c0 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
177d0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
177e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
17800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17840 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
17850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17890 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
178a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
178b0 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67  egin NFS Locking
178c0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
178d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178e0 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
178f0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
17900 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
17910 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a  ING_STYLE./*. **
17920 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
17930 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
17940 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
17950 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
17960 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d   eFileLock. ** m
17970 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
17980 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
17990 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66  LOCK.. **. ** If
179a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
179b0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
179c0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
179d0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
179e0 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  . ** the request
179f0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
17a00 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
17a10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73  s a no-op.. */.s
17a20 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c  tatic int nfsUnl
17a30 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17a40 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
17a50 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ock){.  return p
17a60 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
17a70 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a  FileLock, 1);.}.
17a80 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
17a90 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
17aa0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
17ab0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
17ac0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
17ad0 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20  bove is the NFS 
17ae0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
17af0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
17b00 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
17b10 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
17b20 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
17b30 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
17b40 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
17b50 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
17b60 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  le.  .**.*******
17b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
17b80 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f  nd of the NFS lo
17b90 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
17ba0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
17bb0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
17bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c00 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
17c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
17c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c  ********** Non-l
17c70 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  ocking sqlite3_f
17c80 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile methods ****
17c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
17cb0 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f  The next divisio
17cc0 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65  n contains imple
17cd0 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61  mentations for a
17ce0 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ll methods of th
17cf0 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  e .** sqlite3_fi
17d00 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20  le object other 
17d10 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  than the locking
17d20 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c   methods.  The l
17d30 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64  ocking.** method
17d40 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69  s were defined i
17d50 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76  n divisions abov
17d60 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d  e (one locking m
17d70 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76  ethod per.** div
17d80 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d  ision).  Those m
17d90 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20  ethods that are 
17da0 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
17db0 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61  cking modes.** a
17dc0 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68  re gather togeth
17dd0 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76  er into this div
17de0 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ision..*/../*.**
17df0 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
17e00 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68  set passed as th
17e10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17e20 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  t, then read cnt
17e30 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20   .** bytes into 
17e40 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65  pBuf. Return the
17e50 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
17e60 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a   actually read..
17e70 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f  **.** NB:  If yo
17e80 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  u define USE_PRE
17e90 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36  AD or USE_PREAD6
17ea0 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  4, then it might
17eb0 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65   also.** be nece
17ec0 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20  ssary to define 
17ed0 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f  _XOPEN_SOURCE to
17ee0 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76   be 500.  This v
17ef0 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e  aries from.** on
17f00 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74  e system to anot
17f10 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69  her.  Since SQLi
17f20 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69  te does not defi
17f30 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20  ne USE_PREAD.** 
17f40 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20  any any form by 
17f50 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
17f60 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
17f70 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
17f80 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
17f90 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
17fa0 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
17fb0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
17fc0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
17fd0 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
17fe0 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
17ff0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
18000 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
18010 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
18020 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
18030 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
18040 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
18050 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
18060 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69  ){.  int got;.#i
18070 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f  f (!defined(USE_
18080 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e  PREAD) && !defin
18090 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29  ed(USE_PREAD64))
180a0 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
180b0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
180c0 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69  _START;.#if defi
180d0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
180e0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65   do{ got = osPre
180f0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
18100 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77  cnt, offset); }w
18110 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
18120 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
18130 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18140 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
18150 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
18160 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67  PREAD64).  do{ g
18170 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69  ot = osPread64(i
18180 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
18190 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65   offset); }while
181a0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
181b0 3d 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d 75  ==EINTR);.  Simu
181c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
181d0 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
181e0 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
181f0 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
18200 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53  , SEEK_SET);.  S
18210 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18220 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20  newOffset-- );. 
18230 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
18240 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66  offset ){.    if
18250 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
18260 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  1 ){.      ((uni
18270 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18280 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
18290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
182a0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
182b0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
182c0 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ...    }.    ret
182d0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f  urn -1;.  }.  do
182e0 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69  { got = osRead(i
182f0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
18300 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
18310 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
18320 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  );.#endif.  TIME
18330 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74  R_END;.  if( got
18340 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  <0 ){.    ((unix
18350 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18360 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18370 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  }.  OSTRACE(("RE
18380 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25  AD    %-3d %5d %
18390 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
183a0 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
183b0 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
183c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
183d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
183e0 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
183f0 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
18400 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18410 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
18420 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
18430 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
18440 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
18450 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
18460 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
18470 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71  t unixRead(.  sq
18480 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18490 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  .  void *pBuf, .
184a0 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
184b0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
184c0 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t.){.  unixFile 
184d0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
184e0 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67  le *)id;.  int g
184f0 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ot;.  assert( id
18500 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
18510 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
18520 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
18530 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
18540 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
18550 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
18560 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
18570 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
18580 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
18590 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
185a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
185b0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
185c0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
185d0 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
185e0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
185f0 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
18600 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
18610 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
18620 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
18630 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
18640 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
18650 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18660 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
18670 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
18680 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
18690 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
186a0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
186b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
186c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
186d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
186e0 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
186f0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
18700 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
18710 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
18720 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
18730 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
18740 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
18750 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
18760 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
18770 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
18780 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
18790 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
187a0 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
187b0 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
187c0 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
187d0 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
187e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
187f0 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
18800 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
18810 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
18820 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
18830 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
18840 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
18850 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
18860 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
18870 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
18880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
18890 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
188a0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
188b0 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
188c0 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
188d0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
188e0 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
188f0 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
18900 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
18910 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
18920 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
18930 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
18940 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
18950 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74  o{ got = osPwrit
18960 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
18970 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
18980 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
18990 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
189a0 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
189b0 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67  PREAD64).  do{ g
189c0 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28  ot = osPwrite64(
189d0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
189e0 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65  , offset);}while
189f0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
18a00 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
18a10 20 20 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66    do{.    newOff
18a20 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
18a30 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
18a40 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
18a50 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
18a60 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66  fset-- );.    if
18a70 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
18a80 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  set ){.      if(
18a90 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
18aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e   ){.        ((un
18ab0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
18ac0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
18ad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18ae0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
18af0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
18b00 3d 20 30 3b 09 09 09 0a 20 20 20 20 20 20 7d 0a  = 0;....      }.
18b10 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
18b20 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d  .    }.    got =
18b30 20 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20   osWrite(id->h, 
18b40 70 42 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77  pBuf, cnt);.  }w
18b50 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
18b60 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
18b70 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
18b80 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
18b90 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
18ba0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
18bb0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20   = errno;.  }.. 
18bc0 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
18bd0 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
18be0 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68  d %llu\n", id->h
18bf0 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54  , got, offset, T
18c00 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
18c10 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
18c20 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
18c30 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
18c40 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
18c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18c60 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
18c70 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
18c80 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
18c90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18ca0 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
18cb0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18cc0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
18cd0 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
18ce0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
18cf0 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
18d00 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
18d10 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
18d20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
18d30 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
18d40 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
18d50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
18d60 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
18d70 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
18d80 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
18d90 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
18da0 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
18db0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
18dc0 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
18dd0 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
18de0 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
18df0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
18e00 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
18e10 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
18e20 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
18e30 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
18e40 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
18e50 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
18e60 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
18e70 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
18e80 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
18e90 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
18ea0 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
18eb0 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20  d to.  ** doing 
18ec0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
18ed0 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
18ee0 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
18ef0 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a  ther than a.  **
18f00 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
18f10 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f   file) then reco
18f20 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
18f30 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
18f40 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ** has changed. 
18f50 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
18f60 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d  ion counter is m
18f70 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20  odified, record 
18f80 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74  that.  ** fact t
18f90 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  oo..  */.  if( p
18fa0 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
18fb0 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ite ){.    pFile
18fc0 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20  ->dbUpdate = 1; 
18fd0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
18fe0 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
18ff0 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  ed */.    if( of
19000 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73  fset<=24 && offs
19010 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20  et+amt>=27 ){.  
19020 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
19030 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34    char oldCntr[4
19040 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ];.      Simulat
19050 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
19060 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
19070 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
19080 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29   24, oldCntr, 4)
19090 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
190a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
190b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
190c0 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43  4 || memcmp(oldC
190d0 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42  ntr, &((char*)pB
190e0 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20  uf)[24-offset], 
190f0 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)!=0 ){.       
19100 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
19110 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54  rChng = 1;  /* T
19120 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
19130 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67  ounter has chang
19140 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ed */.      }.  
19150 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
19160 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
19170 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  & (wrote = seekA
19180 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f  ndWrite(pFile, o
19190 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
191a0 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
191b0 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
191c0 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
191d0 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
191e0 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
191f0 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
19200 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
19210 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
19220 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
19230 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
19240 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69  , amt=1 ));..  i
19250 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
19260 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70  if( wrote<0 && p
19270 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21  File->lastErrno!
19280 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20  =ENOSPC ){.     
19290 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
192a0 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
192b0 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
192c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
192d0 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
192e0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
192f0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20  stErrno = 0; /* 
19300 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
19310 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  or */.      retu
19320 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
19330 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
19340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19350 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19360 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
19370 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
19380 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
19390 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
193a0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
193b0 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
193c0 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
193d0 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68   occurring at th
193e0 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
193f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
19400 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
19410 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
19420 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
19430 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64  ndif../*.** We d
19440 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74  o not trust syst
19450 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ems to provide a
19460 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79   working fdatasy
19470 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a  nc().  Some do..
19480 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e  ** Others do no.
19490 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65    To be safe, we
194a0 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68   will stick with
194b0 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73   the (slightly s
194c0 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28  lower).** fsync(
194d0 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ). If you know t
194e0 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
194f0 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
19500 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
19510 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
19520 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
19530 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
19540 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
19550 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
19560 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
19570 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
19580 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
19590 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
195a0 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
195b0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
195c0 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
195d0 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
195e0 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
195f0 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
19600 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
19610 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
19620 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
19630 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
19640 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
19650 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
19660 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
19670 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
19680 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
19690 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
196a0 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
196b0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
196c0 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
196d0 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
196e0 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
196f0 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
19700 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
19710 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
19720 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
19730 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
19740 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
19750 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
19760 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
19770 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
19780 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
19790 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
197a0 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
197b0 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
197c0 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
197d0 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
197e0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
197f0 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
19800 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
19810 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
19820 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
19830 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
19840 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
19850 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
19860 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19870 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
19880 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
19890 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
198a0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
198b0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
198c0 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
198d0 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
198e0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
198f0 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
19900 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
19910 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
19920 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
19930 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
19940 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
19950 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
19960 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
19970 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
19980 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
19990 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
199a0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
199b0 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
199c0 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
199d0 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
199e0 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
199f0 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
19a00 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
19a10 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
19a20 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
19a30 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
19a40 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
19a50 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
19a60 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
19a70 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
19a80 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
19a90 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
19aa0 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
19ab0 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
19ac0 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
19ad0 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
19ae0 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
19af0 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
19b00 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
19b10 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
19b20 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
19b30 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
19b40 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
19b50 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
19b60 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
19b70 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
19b80 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
19b90 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
19ba0 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
19bb0 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
19bc0 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
19bd0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
19be0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
19bf0 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
19c00 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
19c10 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
19c20 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
19c30 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
19c40 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
19c50 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
19c60 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
19c70 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
19c80 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
19c90 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
19ca0 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
19cb0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
19cc0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
19cd0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
19ce0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
19cf0 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
19d00 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
19d10 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
19d20 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
19d30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
19d40 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
19d50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
19d60 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
19d70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19d80 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
19d90 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
19da0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
19db0 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
19dc0 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
19dd0 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
19de0 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
19df0 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
19e00 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
19e10 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
19e20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
19e30 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
19e40 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
19e50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19e60 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
19e70 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
19e80 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
19e90 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
19ea0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
19eb0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
19ec0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
19ed0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
19ee0 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
19ef0 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
19f00 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
19f10 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
19f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
19f30 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
19f40 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
19f50 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  {.    rc = osFcn
19f60 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
19f70 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  NC, 0);.  }else{
19f80 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
19f90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c  .  /* If the FUL
19fa0 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66  LFSYNC failed, f
19fb0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65  all back to atte
19fc0 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28  mpting an fsync(
19fd0 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c  )..  ** It shoul
19fe0 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65  dn't be possible
19ff0 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74   for fullfsync t
1a000 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f  o fail on the lo
1a010 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73  cal .  ** file s
1a020 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20  ystem (on OSX), 
1a030 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63  so failure indic
1a040 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53  ates that FULLFS
1a050 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73  YNC.  ** isn't s
1a060 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69  upported for thi
1a070 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53  s file system. S
1a080 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73  o, attempt an fs
1a090 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66  ync .  ** and (f
1a0a0 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74  or now) ignore t
1a0b0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61  he overhead of a
1a0c0 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e   superfluous fcn
1a0d0 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20  tl call.  .  ** 
1a0e0 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74  It'd be better t
1a0f0 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79  o detect fullfsy
1a100 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20  nc support once 
1a110 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20  and avoid .  ** 
1a120 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65  the fcntl call e
1a130 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69  very time sync i
1a140 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20  s called..  */. 
1a150 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66   if( rc ) rc = f
1a160 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66  sync(fd);..#elif
1a170 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1a180 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79  __).  /* fdatasy
1a190 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65  nc() on HFS+ doe
1a1a0 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74  sn't yet flush t
1a1b0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20  he file size if 
1a1c0 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65  it changed corre
1a1d0 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72  ctly.  ** so cur
1a1e0 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c  rently we defaul
1a1f0 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74  t to the macro t
1a200 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64  hat redefines fd
1a210 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63  atasync to fsync
1a220 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79  .  */.  rc = fsy
1a230 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20  nc(fd);.#else . 
1a240 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28   rc = fdatasync(
1a250 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  fd);.#if OS_VXWO
1a260 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31  RKS.  if( rc==-1
1a270 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53   && errno==ENOTS
1a280 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  UP ){.    rc = f
1a290 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65  sync(fd);.  }.#e
1a2a0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
1a2b0 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  KS */.#endif /* 
1a2c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1a2d0 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46  SYNC elif HAVE_F
1a2e0 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69  ULLFSYNC */..  i
1a2f0 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  f( OS_VXWORKS &&
1a300 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20   rc!= -1 ){.    
1a310 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  rc = 0;.  }.  re
1a320 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a330 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65  * Open a file de
1a340 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
1a350 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1a360 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e  ning file zFilen
1a370 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  ame..** If succe
1a380 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73  ssful, *pFd is s
1a390 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  et to the opened
1a3a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a3b0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1a3c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
1a3d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1a3e0 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  s, either SQLITE
1a3f0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c  _NOMEM.** or SQL
1a400 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20  ITE_CANTOPEN is 
1a410 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46  returned and *pF
1a420 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75  d is set to an u
1a430 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75  ndefined.** valu
1a440 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72  e..**.** The dir
1a450 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
1a460 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66  riptor is used f
1a470 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e  or only one thin
1a480 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28  g - to.** fsync(
1a490 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f  ) a directory to
1a4a0 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20   make sure file 
1a4b0 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c  creation and del
1a4c0 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20  etion events.** 
1a4d0 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64  are flushed to d
1a4e0 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63  isk.  Such fsync
1a4f0 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64  s are not needed
1a500 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75   on newer.** jou
1a510 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74  rnaling filesyst
1a520 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71  ems, but are req
1a530 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66  uired on older f
1a540 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a  ilesystems..**.*
1a550 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1a560 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  an be overridden
1a570 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53   using the xSetS
1a580 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65  ysCall interface
1a590 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79  ..** The ability
1a5a0 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69   to override thi
1a5b0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64  s routine was ad
1a5c0 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f  ded in support o
1a5d0 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75  f the.** chromiu
1a5e0 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e  m sandbox.  Open
1a5f0 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
1a600 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69  is a security ri
1a610 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f  sk (we are.** to
1a620 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74  ld) so making it
1a630 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c   overrideable al
1a640 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75  lows the chromiu
1a650 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20  m sandbox to.** 
1a660 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75  replace this rou
1a670 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d  tine with a harm
1a680 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20  less no-op.  To 
1a690 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  make this routin
1a6a0 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65  e.** a no-op, re
1a6b0 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20  place it with a 
1a6c0 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e  stub that return
1a6d0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  s SQLITE_OK but 
1a6e0 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73  leaves.** *pFd s
1a6f0 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65  et to a negative
1a700 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   number..**.** I
1a710 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1a720 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c  eturned, the cal
1a730 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1a740 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a  le for closing.*
1a750 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
1a760 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67  iptor *pFd using
1a770 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61   close()..*/.sta
1a780 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65  tic int openDire
1a790 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  ctory(const char
1a7a0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74   *zFilename, int
1a7b0 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69   *pFd){.  int ii
1a7c0 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
1a7d0 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65  .  char zDirname
1a7e0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
1a7f0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1a800 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
1a810 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25  ME, zDirname, "%
1a820 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
1a830 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74    for(ii=(int)st
1a840 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20  rlen(zDirname); 
1a850 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65  ii>1 && zDirname
1a860 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29  [ii]!='/'; ii--)
1a870 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a  ;.  if( ii>0 ){.
1a880 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d      zDirname[ii]
1a890 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20   = '\0';.    fd 
1a8a0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44  = robust_open(zD
1a8b0 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
1a8c0 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
1a8d0 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
1a8e0 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
1a8f0 43 0a 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28  C.      osFcntl(
1a900 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46  fd, F_SETFD, osF
1a910 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44  cntl(fd, F_GETFD
1a920 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
1a930 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  C);.#endif.     
1a940 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1a950 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1a960 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1a970 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20     }.  }.  *pFd 
1a980 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  = fd;.  return (
1a990 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  fd>=0?SQLITE_OK:
1a9a0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1a9b0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1a9c0 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e  T, "open", zDirn
1a9d0 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ame));.}../*.** 
1a9e0 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
1a9f0 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1aa00 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1aa10 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1aa20 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1aa30 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1aa40 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1aa50 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1aa60 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1aa70 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1aa80 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1aa90 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1aaa0 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1aab0 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1aac0 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1aad0 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1aae0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1aaf0 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1ab00 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1ab10 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1ab20 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1ab30 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1ab40 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1ab50 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1ab60 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1ab70 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1ab80 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1ab90 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
1aba0 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1abb0 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
1abc0 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
1abd0 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
1abe0 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
1abf0 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
1ac00 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
1ac10 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
1ac20 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1ac30 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1ac40 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1ac50 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
1ac60 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
1ac70 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1ac80 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
1ac90 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
1aca0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1acb0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
1acc0 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
1acd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1ace0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
1acf0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
1ad00 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1ad10 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
1ad20 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
1ad30 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
1ad40 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
1ad50 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
1ad60 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1ad70 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
1ad80 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1ad90 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
1ada0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
1adb0 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
1adc0 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
1add0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1ade0 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
1adf0 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
1ae00 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1ae10 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
1ae20 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
1ae30 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
1ae40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1ae50 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
1ae60 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
1ae70 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
1ae80 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
1ae90 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
1aea0 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
1aeb0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1aec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1aed0 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
1aee0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
1aef0 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
1af00 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
1af10 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
1af20 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
1af30 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1af40 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1af50 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1af60 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1af70 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1af80 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1af90 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1afa0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1afb0 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f  RR_FSYNC, "full_
1afc0 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  fsync", pFile->z
1afd0 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Path);.  }..  /*
1afe0 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20   Also fsync the 
1aff0 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1b000 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66  ning the file if
1b010 20 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61   the DIRSYNC fla
1b020 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20  g.  ** is set.  
1b030 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69  This is a one-ti
1b040 6d 65 20 6f 63 63 75 72 72 61 6e 63 65 2e 20 20  me occurrance.  
1b050 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78  Many systems (ex
1b060 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a  amples: AIX).  *
1b070 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  * are unable to 
1b080 66 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72  fsync a director
1b090 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72  y, so ignore err
1b0a0 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63  ors on the fsync
1b0b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1b0c0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1b0d0 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1b0e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66   ){.    int dirf
1b0f0 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  d;.    OSTRACE((
1b100 22 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76  "DIRSYNC %s (hav
1b110 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66  e_fullfsync=%d f
1b120 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20  ullsync=%d)\n", 
1b130 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20  pFile->zPath,.  
1b140 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46            HAVE_F
1b150 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c  ULLFSYNC, isFull
1b160 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d  sync));.    rc =
1b170 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   osOpenDirectory
1b180 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
1b190 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
1b1a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b1b0 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20   dirfd>=0 ){.   
1b1c0 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69     full_fsync(di
1b1d0 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rfd, 0, 0);.    
1b1e0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1b1f0 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c  File, dirfd, __L
1b200 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
1b210 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1b220 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
1b230 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b240 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  K;.    }.    pFi
1b250 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
1b260 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59   ~UNIXFILE_DIRSY
1b270 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  NC;.  }.  return
1b280 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
1b290 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
1b2a0 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
1b2b0 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
1b2c0 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
1b2d0 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
1b2e0 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
1b2f0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1b300 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
1b310 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  )id;.  int rc;. 
1b320 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1b330 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1b340 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1b350 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1b360 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
1b370 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
1b380 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
1b390 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
1b3a0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1b3b0 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
1b3c0 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
1b3d0 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
1b3e0 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
1b3f0 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
1b400 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
1b410 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
1b420 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
1b430 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
1b440 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
1b450 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1b460 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42  zChunk ){.    nB
1b470 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
1b480 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
1b490 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
1b4a0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1b4b0 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
1b4c0 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
1b4d0 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66  te(pFile->h, (of
1b4e0 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66  f_t)nByte);.  if
1b4f0 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1b500 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1b510 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1b520 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1b530 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1b540 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1b550 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1b560 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65  .  }else{.#ifnde
1b570 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
1b580 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1b590 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
1b5a0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
1b5b0 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
1b5c0 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
1b5d0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1b5e0 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1b5f0 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1b600 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
1b610 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1b620 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
1b630 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1b640 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
1b650 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
1b660 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
1b670 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1b680 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
1b690 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
1b6a0 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
1b6b0 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
1b6c0 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
1b6d0 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
1b6e0 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
1b6f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
1b700 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1b710 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29  te && nByte==0 )
1b720 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74  {.      pFile->t
1b730 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1b740 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1b750 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b760 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
1b770 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
1b780 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1b790 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
1b7a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1b7b0 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
1b7c0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1b7d0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
1b7e0 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
1b7f0 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
1b800 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f  ( id );.  rc = o
1b810 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c  sFstat(((unixFil
1b820 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
1b830 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1b840 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1b850 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1b860 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1b870 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1b880 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
1b890 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1b8a0 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1b8b0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1b8c0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1b8d0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1b8e0 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1b8f0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1b900 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1b910 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1b920 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1b930 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1b940 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1b950 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1b960 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1b970 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1b980 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1b990 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1b9a0 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1b9b0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1b9c0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1b9d0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1b9e0 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1b9f0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1ba00 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1ba10 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1ba20 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1ba30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1ba40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1ba50 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1ba60 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1ba70 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1ba80 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1ba90 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1baa0 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1bab0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1bac0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1bad0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1bae0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1baf0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1bb00 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1bb10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1bb20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1bb30 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1bb40 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1bb50 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1bb60 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1bb70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1bb80 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1bb90 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1bba0 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1bbb0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1bbc0 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1bbd0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1bbe0 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1bbf0 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1bc00 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1bc10 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1bc20 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1bc30 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1bc40 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1bc50 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1bc60 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1bc70 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1bc80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1bc90 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1bca0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1bcb0 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1bcc0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1bcd0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1bce0 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1bcf0 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1bd00 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1bd10 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  f) ) return SQLI
1bd20 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1bd30 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e  .    nSize = ((n
1bd40 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68  Byte+pFile->szCh
1bd50 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e  unk-1) / pFile->
1bd60 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1bd70 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69  ->szChunk;.    i
1bd80 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75  f( nSize>(i64)bu
1bd90 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69  f.st_size ){..#i
1bda0 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
1bdb0 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
1bdc0 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
1bdd0 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a  LLOCATE.      /*
1bde0 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20   The code below 
1bdf0 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20  is handling the 
1be00 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
1be10 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20  osFallocate() . 
1be20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c       ** correctl
1be30 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  y. posix_falloca
1be40 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  te() is defined 
1be50 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f  to "returns zero
1be60 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20   on success, .  
1be70 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72      ** or an err
1be80 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61  or number on  fa
1be90 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20  ilure". See the 
1bea0 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61  manpage for deta
1beb0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ils. */.      in
1bec0 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b  t err;.      do{
1bed0 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f  .        err = o
1bee0 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65  sFallocate(pFile
1bef0 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65  ->h, buf.st_size
1bf00 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73  , nSize-buf.st_s
1bf10 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ize);.      }whi
1bf20 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29  le( err==EINTR )
1bf30 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20  ;.      if( err 
1bf40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1bf50 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c  IOERR_WRITE;.#el
1bf60 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  se.      /* If t
1bf70 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68  he OS does not h
1bf80 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ave posix_falloc
1bf90 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20  ate(), fake it. 
1bfa0 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20 20  First use.      
1bfb0 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  ** ftruncate() t
1bfc0 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 73  o set the file s
1bfd0 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  ize, then write 
1bfe0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
1bff0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
1c000 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20  st byte in each 
1c010 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65  block within the
1c020 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e   extended region
1c030 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
1c040 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63 68  is the same tech
1c050 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67 6c  nique used by gl
1c060 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ibc to implement
1c070 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1c080 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73  ().      ** on s
1c090 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e  ystems that do n
1c0a0 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66  ot have a real f
1c0b0 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65  allocate() syste
1c0c0 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  m call..      */
1c0d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
1c0e0 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
1c0f0 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
1c100 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
1c110 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
1c120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c130 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
1c140 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1c150 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73  .      if( robus
1c160 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1c170 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a  e->h, nSize) ){.
1c180 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
1c190 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1c1a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1c1b0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1c1c0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1c1d0 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1c1e0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1c1f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c200 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74  Write = ((buf.st
1c210 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d  _size + 2*nBlk -
1c220 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31   1)/nBlk)*nBlk-1
1c230 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  ;.      while( i
1c240 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a 20  Write<nSize ){. 
1c250 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74         int nWrit
1c260 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1c270 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
1c280 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
1c290 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20  if( nWrite!=1 ) 
1c2a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1c2b0 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ERR_WRITE;.     
1c2c0 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c     iWrite += nBl
1c2d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
1c2e0 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  f.    }.  }..  r
1c2f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  .}../*.** Inform
1c310 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
1c320 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
1c330 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
1c340 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1c350 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1c360 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
1c370 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1c380 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1c390 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1c3a0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1c3b0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1c3c0 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
1c3d0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
1c3e0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1c3f0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
1c400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c410 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1c420 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
1c430 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
1c440 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
1c450 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1c460 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c470 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1c480 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1c490 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
1c4a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
1c4b0 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
1c4c0 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
1c4d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c4e0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1c4f0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1c500 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  T: {.      int r
1c510 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  c;.      Simulat
1c520 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1c530 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63  );.      rc = fc
1c540 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c  ntlSizeHint(pFil
1c550 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  e, *(i64 *)pArg)
1c560 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1c570 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1c580 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1c590 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  c;.    }.    cas
1c5a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1c5b0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1c5c0 20 20 20 20 69 6e 74 20 62 50 65 72 73 69 73 74      int bPersist
1c5d0 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a   = *(int*)pArg;.
1c5e0 20 20 20 20 20 20 69 66 28 20 62 50 65 72 73 69        if( bPersi
1c5f0 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  st<0 ){.        
1c600 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 70  *(int*)pArg = (p
1c610 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1c620 26 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  & UNIXFILE_PERSI
1c630 53 54 5f 57 41 4c 29 21 3d 30 3b 0a 20 20 20 20  ST_WAL)!=0;.    
1c640 20 20 7d 65 6c 73 65 20 69 66 28 20 62 50 65 72    }else if( bPer
1c650 73 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sist==0 ){.     
1c660 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1c670 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45  ags &= ~UNIXFILE
1c680 5f 50 45 52 53 49 53 54 5f 57 41 4c 3b 0a 20 20  _PERSIST_WAL;.  
1c690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c6a0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1c6b0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
1c6c0 50 45 52 53 49 53 54 5f 57 41 4c 3b 0a 20 20 20  PERSIST_WAL;.   
1c6d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1c6e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1c6f0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1c700 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  G.    /* The pag
1c710 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65  er calls this me
1c720 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74  thod to signal t
1c730 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a  hat it has done.
1c740 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
1c750 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  k and that the d
1c760 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65  atabase is there
1c770 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61  fore unchanged a
1c780 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e  nd.    ** it hen
1c790 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  ce it is OK for 
1c7a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c7b0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74  change counter t
1c7c0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68  o be.    ** unch
1c7d0 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  anged..    */.  
1c7e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1c7f0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1c800 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
1c810 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64  File*)id)->dbUpd
1c820 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ate = 0;.      r
1c830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c840 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1c850 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c860 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1c870 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1c880 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
1c890 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
1c8a0 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
1c8b0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
1c8c0 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
1c8d0 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69    return proxyFi
1c8e0 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c  leControl(id,op,
1c8f0 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pArg);.    }.#en
1c900 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1c910 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1c920 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1c930 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20  APPLE__) */.    
1c940 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1c950 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20  L_SYNC_OMITTED: 
1c960 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1c970 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20  QLITE_OK;  /* A 
1c980 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20  no-op */.    }. 
1c990 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1c9a0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
1c9b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c9c0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
1c9d0 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
1c9e0 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
1c9f0 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
1ca00 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
1ca10 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
1ca20 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
1ca30 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
1ca40 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
1ca50 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
1ca60 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
1ca70 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
1ca80 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
1ca90 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
1caa0 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
1cab0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
1cac0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
1cad0 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
1cae0 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
1caf0 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
1cb00 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
1cb10 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
1cb20 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
1cb30 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
1cb40 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1cb50 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1cb60 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
1cb70 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1cb80 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
1cb90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1cba0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1cbb0 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
1cbc0 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63  urn the device c
1cbd0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66  haracteristics f
1cbe0 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  or the file. Thi
1cbf0 73 20 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f  s is always 0 fo
1cc00 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69  r unix..*/.stati
1cc10 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
1cc20 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1cc30 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
1cc40 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
1cc50 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1cc60 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ed);.  return 0;
1cc70 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1cc80 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a  TE_OMIT_WAL.../*
1cc90 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
1cca0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20  to represent an 
1ccb0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75  shared memory bu
1ccc0 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  ffer.  .**.** Wh
1ccd0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
1cce0 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
1ccf0 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69  e the same wal-i
1cd00 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61  ndex, each threa
1cd10 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e  d.** has its own
1cd20 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c   unixShm object,
1cd30 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f   but they all po
1cd40 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
1cd50 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74  instance.** of t
1cd60 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
1cd70 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
1cd80 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61  r words, each wa
1cd90 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  l-index is opene
1cda0 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  d.** only once p
1cdb0 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
1cdc0 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f  * Each unixShmNo
1cdd0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  de object is con
1cde0 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67  nected to a sing
1cdf0 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  le unixInodeInfo
1ce00 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63   object..** We c
1ce10 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68  ould coalesce th
1ce20 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75  is object into u
1ce30 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75  nixInodeInfo, bu
1ce40 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61  t that would mea
1ce50 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20  n.** every open 
1ce60 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  file that does n
1ce70 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65  ot use shared me
1ce80 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77  mory (in other w
1ce90 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70  ords, most.** op
1cea0 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20  en files) would 
1ceb0 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72  have to carry ar
1cec0 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20  ound this extra 
1ced0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f  information.  So
1cee0 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  .** the unixInod
1cef0 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e  eInfo object con
1cf00 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
1cf10 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  to this unixShmN
1cf20 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e  ode object.** an
1cf30 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  d the unixShmNod
1cf40 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
1cf50 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65  ted only when ne
1cf60 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78  eded..**.** unix
1cf70 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
1cf80 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
1cf90 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
1cfa0 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
1cfb0 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
1cfc0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
1cfd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
1cfe0 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
1cff0 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20   nRef.**.** The 
1d000 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1d010 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
1d020 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
1d030 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a  is created:.** .
1d040 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20  **      fid.**  
1d050 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a      zFilename.**
1d060 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53  .** Either unixS
1d070 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
1d080 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69  t be held or uni
1d090 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
1d0a0 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65   and.** unixMute
1d0b0 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
1d0c0 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
1d0d0 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
1d0e0 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
1d0f0 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
1d100 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e  .struct unixShmN
1d110 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ode {.  unixInod
1d120 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
1d130 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49     /* unixInodeI
1d140 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68  nfo that owns th
1d150 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20  is SHM node */. 
1d160 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
1d170 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
1d180 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
1d190 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
1d1a0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
1d1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1d1c0 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65  me of the mmappe
1d1d0 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
1d1e0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1d1f0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
1d200 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1d210 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
1d220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d230 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
1d240 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
1d250 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e  */.  u16 nRegion
1d260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d270 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
1d280 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75   apRegion */.  u
1d290 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20  8 isReadonly;   
1d2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d2b0 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e if read-only *
1d2c0 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67  /.  char **apReg
1d2d0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ion;           /
1d2e0 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65  * Array of mappe
1d2f0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
1d300 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
1d310 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
1d320 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d330 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a  r of unixShm obj
1d340 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
1d350 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53   this */.  unixS
1d360 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
1d370 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69        /* All uni
1d380 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
1d390 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
1d3a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d3b0 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61  EBUG.  u8 exclMa
1d3c0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1d3d0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
1d3e0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
1d3f0 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64  d */.  u8 shared
1d400 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1d410 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1d420 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1d430 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  /.  u8 nextShmId
1d440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d450 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
1d460 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75   unixShm.id valu
1d470 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1d480 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
1d490 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
1d4a0 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
1d4b0 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
1d4c0 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
1d4d0 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
1d4e0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
1d4f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1d500 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
1d510 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
1d520 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
1d530 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
1d540 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
1d550 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  **.**    unixShm
1d560 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69  .pFile.**    uni
1d570 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  xShm.id.**.** Al
1d580 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
1d590 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
1d5a0 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c  The unixShm.pFil
1d5b0 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
1d5c0 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61   held.** while a
1d5d0 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61  ccessing any rea
1d5e0 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a  d/write fields..
1d5f0 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
1d600 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  m {.  unixShmNod
1d610 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
1d620 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1d630 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ng unixShmNode o
1d640 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53  bject */.  unixS
1d650 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
1d660 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1d670 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  ixShm with the s
1d680 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ame unixShmNode 
1d690 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
1d6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d6b0 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
1d6c0 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  ng the unixShmNo
1d6d0 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38  de mutex */.  u8
1d6e0 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
1d6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
1d700 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
1d710 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69  n within its uni
1d720 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31  xShmNode */.  u1
1d730 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
1d740 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1d750 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
1d760 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
1d770 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
1d780 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1d790 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
1d7a0 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   held */.};../*.
1d7b0 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
1d7c0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
1d7d0 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
1d7e0 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
1d7f0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
1d800 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  4)         /* fi
1d810 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
1d820 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
1d830 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53  M_DMS    (UNIX_S
1d840 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
1d850 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
1d860 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
1d870 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73  ./*.** Apply pos
1d880 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
1d890 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20  s for all bytes 
1d8a0 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67  from ofst throug
1d8b0 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a  h ofst+n-1..**.*
1d8c0 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66  * Locks block if
1d8d0 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61   the mask is exa
1d8e0 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20  ctly UNIX_SHM_C 
1d8f0 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63  and are non-bloc
1d900 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73  king.** otherwis
1d910 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d920 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
1d930 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  ck(.  unixShmNod
1d940 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20  e *pShmNode, /* 
1d950 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
1d960 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
1d970 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
1d980 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
1d990 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f  ,          /* F_
1d9a0 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20  UNLCK, F_RDLCK, 
1d9b0 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
1d9c0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1d9d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1d9e0 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  byte of the lock
1d9f0 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69  ing range */.  i
1da00 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
1da10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1da20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
1da30 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
1da40 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f  flock f;       /
1da50 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69  * The posix advi
1da60 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72  sory locking str
1da70 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
1da80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1da90 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1daa0 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f   form fcntl() */
1dab0 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
1dac0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1dad0 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
1dae0 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
1daf0 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
1db00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1db10 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
1db20 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
1db30 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
1db40 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
1db50 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
1db60 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
1db70 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
1db80 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
1db90 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
1dba0 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
1dbb0 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
1dbc0 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49  ( n>=1 && n<SQLI
1dbd0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
1dbe0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1dbf0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
1dc00 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
1dc10 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
1dc20 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
1dc30 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
1dc40 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
1dc50 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
1dc60 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
1dc70 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
1dc80 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
1dc90 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
1dca0 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
1dcb0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
1dcc0 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72  ETLK, &f);.    r
1dcd0 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
1dce0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
1dcf0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
1dd00 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
1dd10 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
1dd20 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
1dd30 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
1dd40 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
1dd50 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
1dd60 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1dd70 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31  "));.  mask = (1
1dd80 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
1dd90 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72  <<ofst);.  if( r
1dda0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ddb0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
1ddc0 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
1ddd0 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
1dde0 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
1ddf0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
1de00 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
1de10 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
1de20 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1de30 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1de40 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
1de50 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
1de60 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
1de70 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ead-lock %d ok",
1de80 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
1de90 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
1dea0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1deb0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
1dec0 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
1ded0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dee0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
1def0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
1df00 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
1df10 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ite-lock %d ok",
1df20 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
1df30 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
1df40 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
1df50 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
1df60 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1df70 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1df80 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
1df90 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
1dfa0 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
1dfb0 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
1dfc0 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  fst));.    }else
1dfd0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1dfe0 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
1dff0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
1e000 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
1e010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e020 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
1e030 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
1e040 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
1e050 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  te-lock %d faile
1e060 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
1e070 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
1e080 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20  (" - afterwards 
1e090 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
1e0a0 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1e0b0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  e->sharedMask, p
1e0c0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
1e0d0 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  k));.  }.#endif.
1e0e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
1e0f0 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20       .}.../*.** 
1e100 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
1e110 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
1e120 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
1e130 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
1e140 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
1e150 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
1e160 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
1e170 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
1e180 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
1e190 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
1e1a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
1e1b0 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
1e1c0 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
1e1d0 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
1e1e0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
1e1f0 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
1e200 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
1e210 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
1e220 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
1e230 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20  p && p->nRef==0 
1e240 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1e250 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
1e260 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
1e270 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1e280 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
1e290 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
1e2a0 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
1e2b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1e2c0 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
1e2d0 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70      munmap(p->ap
1e2e0 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a  Region[i], p->sz
1e2f0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
1e300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1e310 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
1e320 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20  Region[i]);.    
1e330 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1e340 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
1e350 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  Region);.    if(
1e360 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
1e370 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1e380 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  Fd, p->h, __LINE
1e390 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  __);.      p->h 
1e3a0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
1e3b0 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  p->pInode->pShmN
1e3c0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ode = 0;.    sql
1e3d0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1e3e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
1e3f0 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1e400 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
1e410 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61  with open databa
1e420 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20  se file pDbFd.  
1e430 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75  .** This particu
1e440 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  lar implementati
1e450 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20  on uses mmapped 
1e460 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
1e470 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d   file used to im
1e480 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d  plement shared-m
1e490 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20  emory is in the 
1e4a0 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a  same directory.*
1e4b0 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  * as the open da
1e4c0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1e4d0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
1e4e0 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  e as the open da
1e4f0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77  tabase.** file w
1e500 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73  ith the "-shm" s
1e510 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f  uffix added.  Fo
1e520 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
1e530 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1e540 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65  ** is "/home/use
1e550 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68  r1/config.db" th
1e560 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  en the file that
1e570 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
1e580 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73  mmapped.** for s
1e590 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
1e5a0 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f  l be called "/ho
1e5b0 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
1e5c0 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a  db-shm".  .**.**
1e5d0 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63   Another approac
1e5e0 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66  h to is to use f
1e5f0 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d  iles in /dev/shm
1e600 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20   or /dev/tmp or 
1e610 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72  an.** some other
1e620 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75   tmpfs mount. Bu
1e630 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61  t if a file in a
1e640 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63   different direc
1e650 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  tory.** from the
1e660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1e670 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66  s used, then dif
1e680 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65  fering access pe
1e690 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20  rmissions.** or 
1e6a0 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74  a chroot() might
1e6b0 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65   cause two diffe
1e6c0 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f  rent processes o
1e6d0 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61  n the same.** da
1e6e0 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70  tabase to end up
1e6f0 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74   using different
1e700 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65   files for share
1e710 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d  d memory - .** m
1e720 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69  eaning that thei
1e730 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e  r memory would n
1e740 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61  ot really be sha
1e750 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a  red - resulting.
1e760 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  ** in database c
1e770 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65  orruption.  Neve
1e780 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74  rtheless, this t
1e790 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a  mpfs file usage.
1e7a0 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65  ** can be enable
1e7b0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1e7c0 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  e using -DSQLITE
1e7d0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22  _SHM_DIRECTORY="
1e7e0 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20  /dev/shm".** or 
1e7f0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  the equivalent. 
1e800 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   The use of the 
1e810 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1e820 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
1e830 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75  e.** option resu
1e840 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  lts in an incomp
1e850 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20  atible build of 
1e860 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20  SQLite;  builds 
1e870 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61  of SQLite.** tha
1e880 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67  t with differing
1e890 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1e8a0 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61  CTORY settings a
1e8b0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68  ttempt to use th
1e8c0 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61  e.** same databa
1e8d0 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
1e8e0 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61  ame time, databa
1e8f0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  se corruption wi
1e900 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
1e910 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f  ult. The SQLITE_
1e920 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
1e930 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
1e940 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a  n is considered.
1e950 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22  ** "unsupported"
1e960 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79   and may go away
1e970 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c   in a future SQL
1e980 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a  ite release..**.
1e990 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
1e9a0 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
1e9b0 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
1e9c0 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
1e9d0 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
1e9e0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
1e9f0 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
1ea00 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
1ea10 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
1ea20 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
1ea30 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1ea40 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
1ea50 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
1ea60 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  cleared..**.** I
1ea70 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
1ea80 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44  atabase file (pD
1ea90 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68  bFd) is using th
1eaa0 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46  e "unix-excl" VF
1eab0 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20  S.** that means 
1eac0 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76  that an exclusiv
1ead0 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  e lock is held o
1eae0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1eaf0 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20  ile and.** that 
1eb00 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
1eb10 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  es are able to r
1eb20 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
1eb30 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a   database.  In.*
1eb40 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20  * that case, we 
1eb50 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65  do not really ne
1eb60 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ed shared memory
1eb70 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d  .  No shared mem
1eb80 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63  ory.** file is c
1eb90 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61  reated.  The sha
1eba0 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
1ebb0 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74  be simulated wit
1ebc0 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a  h heap memory..*
1ebd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1ebe0 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
1ebf0 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46  y(unixFile *pDbF
1ec00 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  d){.  struct uni
1ec10 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20  xShm *p = 0;    
1ec20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1ec30 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
1ec40 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
1ec50 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1ec60 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65  hmNode;   /* The
1ec70 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
1ec80 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1ec90 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ecb0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1ecc0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
1ecd0 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20  *pInode;        
1ece0 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f    /* The inode o
1ecf0 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  f fd */.  char *
1ed00 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  zShmFilename;   
1ed10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1ed20 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73  e of the file us
1ed30 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20  ed for SHM */.  
1ed40 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  int nShmFilename
1ed50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed60 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53  /* Size of the S
1ed70 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62  HM filename in b
1ed80 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ytes */..  /* Al
1ed90 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
1eda0 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d   the new unixShm
1edb0 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20   object. */.  p 
1edc0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1edd0 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
1ede0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1edf0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1ee00 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
1ee10 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1ee20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
1ee30 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
1ee40 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1ee50 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
1ee60 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
1ee70 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
1ee80 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
1ee90 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
1eea0 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
1eeb0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
1eec0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1eed0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
1eee0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
1eef0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
1ef00 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
1ef10 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
1ef20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
1ef30 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
1ef40 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
1ef50 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
1ef60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1ef70 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74     /* Call fstat
1ef80 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
1ef90 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
1efa0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1efb0 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a   file. If.    **
1efc0 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c   a new *-shm fil
1efd0 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
1efe0 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
1eff0 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20   made to create 
1f000 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  it.    ** with t
1f010 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
1f020 6f 6e 73 2e 20 54 68 65 20 61 63 74 75 61 6c 20  ons. The actual 
1f030 70 65 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 20  permissions the 
1f040 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
1f050 20 20 20 20 2a 2a 20 77 69 74 68 20 61 72 65 20      ** with are 
1f060 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63  subject to the c
1f070 75 72 72 65 6e 74 20 75 6d 61 73 6b 20 73 65 74  urrent umask set
1f080 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ting..    */.   
1f090 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62   if( osFstat(pDb
1f0a0 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26  Fd->h, &sStat) &
1f0b0 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  & pInode->bProce
1f0c0 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
1f0d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1f0e0 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
1f0f0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1f100 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  err;.    }..#ifd
1f110 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
1f120 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d  RECTORY.    nShm
1f130 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f  Filename = sizeo
1f140 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f(SQLITE_SHM_DIR
1f150 45 43 54 4f 52 59 29 20 2b 20 33 30 3b 0a 23 65  ECTORY) + 30;.#e
1f160 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65  lse.    nShmFile
1f170 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69 6e 74 29  name = 5 + (int)
1f180 73 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50  strlen(pDbFd->zP
1f190 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ath);.#endif.   
1f1a0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69   pShmNode = sqli
1f1b0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
1f1c0 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
1f1d0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  nShmFilename );.
1f1e0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1f1f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1f200 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1f210 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1f220 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
1f230 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
1f240 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
1f250 53 68 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a  ShmNode));.    z
1f260 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53  ShmFilename = pS
1f270 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1f280 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d  e = (char*)&pShm
1f290 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20  Node[1];.#ifdef 
1f2a0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1f2b0 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33  TORY.    sqlite3
1f2c0 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
1f2d0 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
1f2e0 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  name, .         
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1f300 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1f310 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78   "/sqlite-shm-%x
1f320 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  -%x",.          
1f330 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
1f340 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75  sStat.st_ino, (u
1f350 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29  32)sStat.st_dev)
1f360 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69  ;.#else.    sqli
1f370 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
1f380 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
1f390 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
1f3a0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1f3b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
1f3c0 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
1f3d0 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e  zPath, zShmFilen
1f3e0 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ame);.#endif.   
1f3f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d   pShmNode->h = -
1f400 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49  1;.    pDbFd->pI
1f410 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
1f420 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70   pShmNode;.    p
1f430 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20  ShmNode->pInode 
1f440 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
1f450 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
1f460 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
1f470 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1f480 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
1f490 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
1f4a0 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
1f4b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1f4c0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1f4d0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1f4e0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
1f4f0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
1f500 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ck==0 ){.      c
1f510 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 4f 3b 0a  onst char *zRO;.
1f520 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c        int openFl
1f530 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
1f540 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 7a 52  _CREAT;.      zR
1f550 4f 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  O = sqlite3_uri_
1f560 70 61 72 61 6d 65 74 65 72 28 70 44 62 46 64 2d  parameter(pDbFd-
1f570 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
1f580 79 5f 73 68 6d 22 29 3b 0a 20 20 20 20 20 20 69  y_shm");.      i
1f590 66 28 20 7a 52 4f 20 26 26 20 73 71 6c 69 74 65  f( zRO && sqlite
1f5a0 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 4f 29  3GetBoolean(zRO)
1f5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e   ){.        open
1f5c0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
1f5d0 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  ;.        pShmNo
1f5e0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d  de->isReadonly =
1f5f0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1f600 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
1f610 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
1f620 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c  Filename, openFl
1f630 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d  ags, (sStat.st_m
1f640 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20  ode&0777));.    
1f650 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1f660 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  h<0 ){.        i
1f670 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  f( pShmNode->h<0
1f680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1f690 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
1f6a0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1f6b0 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53  BKPT, "open", zS
1f6c0 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
1f6d0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f         goto shm_
1f6e0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20  open_err;.      
1f6f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20    }.      }.  . 
1f700 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
1f710 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
1f720 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
1f730 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
1f740 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a  switch..      **
1f750 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
1f760 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1f770 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
1f780 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
1f790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1f7a0 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74   if( unixShmSyst
1f7b0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1f7c0 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
1f7d0 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
1f7e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f7f0 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1f800 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
1f810 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  h, 0) ){.       
1f820 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
1f830 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1f840 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75  R_SHMOPEN, "ftru
1f850 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65  ncate", zShmFile
1f860 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
1f870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f880 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f890 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f8a0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
1f8b0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52  ck(pShmNode, F_R
1f8c0 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  DLCK, UNIX_SHM_D
1f8d0 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  MS, 1);.      }.
1f8e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
1f8f0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1f900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1f910 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
1f920 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
1f930 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d  d of the unixShm
1f940 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
1f950 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
1f960 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1f970 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
1f980 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
1f990 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
1f9a0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
1f9b0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
1f9c0 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  = p;.  unixLeave
1f9d0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54  Mutex();..  /* T
1f9e0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
1f9f0 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68  nt on pShmNode h
1fa00 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1fa10 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65  incremented unde
1fa20 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72  r.  ** the cover
1fa30 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65   of the unixEnte
1fa40 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
1fa50 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
1fa60 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
1fa70 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d   (struct unixShm
1fa80 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
1fa90 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
1faa0 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
1fab0 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
1fac0 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
1fad0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
1fae0 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
1faf0 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
1fb00 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
1fb10 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
1fb20 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
1fb30 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
1fb40 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d  e->mutex .  ** m
1fb50 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
1fb60 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1fb70 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1fb80 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
1fb90 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1fba0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
1fbb0 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
1fbc0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1fbd0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1fbe0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1fbf0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
1fc00 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
1fc10 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
1fc20 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72  rr:.  unixShmPur
1fc30 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20  ge(pDbFd);      
1fc40 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
1fc50 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
1fc60 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
1fc70 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1fc80 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1fc90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1fca0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1fcb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1fcc0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
1fcd0 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
1fce0 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
1fcf0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1fd00 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1fd10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fd20 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
1fd30 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
1fd40 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
1fd50 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
1fd60 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
1fd70 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
1fd80 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
1fd90 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
1fda0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1fdb0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1fdc0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1fdd0 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
1fde0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
1fdf0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45  rwise, if the bE
1fe00 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20  xtend parameter 
1fe10 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
1fe20 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1fe30 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
1fe40 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1fe50 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
1fe60 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
1fe70 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
1fe80 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
1fe90 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
1fea0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
1feb0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1fec0 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45  urned. If .** bE
1fed0 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  xtend is non-zer
1fee0 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
1fef0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1ff00 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
1ff10 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
1ff20 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
1ff30 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
1ff40 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
1ff50 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
1ff60 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
1ff70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
1ff80 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
1ff90 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
1ffa0 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
1ffb0 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
1ffc0 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
1ffd0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1ffe0 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
1fff0 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
20000 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
20010 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
20020 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
20030 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
20040 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
20050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
20060 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  nixShmMap(.  sql
20070 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20090 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
200a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
200b0 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
200e0 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
200f0 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20110 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
20120 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64  */.  int bExtend
20130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20140 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
20150 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
20160 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
20170 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20190 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
201a0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ory */.){.  unix
201b0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
201c0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75  nixFile*)fd;.  u
201d0 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69  nixShm *p;.  uni
201e0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
201f0 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
20200 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
20210 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
20220 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f  mory file has no
20230 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
20240 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
20250 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e  */.  if( pDbFd->
20260 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pShm==0 ){.    r
20270 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  c = unixOpenShar
20280 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b  edMemory(pDbFd);
20290 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
202a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
202b0 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70  rc;.  }..  p = p
202c0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53  DbFd->pShm;.  pS
202d0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
202e0 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Node;.  sqlite3_
202f0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
20300 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
20310 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
20320 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
20330 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
20340 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
20350 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
20360 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
20370 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
20380 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
20390 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e  >h>=0 || pDbFd->
203a0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
203b0 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
203c0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
203d0 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  <0 || pDbFd->pIn
203e0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
203f0 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  k==0 );..  if( p
20400 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
20410 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
20420 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20   char **apNew;  
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67      /* New apReg
20450 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ion[] array */. 
20460 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
20470 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67  iRegion+1)*szReg
20480 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  ion;  /* Minimum
20490 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   required file s
204a0 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
204b0 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
204d0 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29   Used by fstat()
204e0 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
204f0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
20500 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28  Region;..    if(
20510 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
20520 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
20530 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
20540 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
20550 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
20560 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
20570 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b  ..      ** Check
20580 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
20590 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
205a0 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
205b0 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
205c0 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65        ** large e
205d0 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
205e0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
205f0 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f  egion)..      */
20600 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
20610 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  at(pShmNode->h, 
20620 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
20630 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
20640 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20  OERR_SHMSIZE;.  
20650 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
20660 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
20670 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74    .      if( sSt
20680 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65  at.st_size<nByte
20690 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
206a0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
206b0 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
206c0 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45  not exist. If bE
206d0 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a  xtend is set to.
206e0 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65          ** false
206f0 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
20700 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
20710 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
20720 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
20730 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
20740 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
20750 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73  y, if bExtend is
20760 20 74 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e   true, use ftrun
20770 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
20780 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  te.        ** th
20790 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
207a0 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20  ry region..     
207b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
207c0 28 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74  ( !bExtend ) got
207d0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
207e0 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73         if( robus
207f0 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d  t_ftruncate(pShm
20800 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20  Node->h, nByte) 
20810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
20820 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
20830 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
20840 49 5a 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  IZE, "ftruncate"
20850 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
20870 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
20880 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
20890 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
208a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
208b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
208c0 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
208d0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
208e0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
208f0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
20900 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
20910 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  = (char **)sqlit
20920 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
20930 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
20940 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e  Region, (iRegion
20950 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  +1)*sizeof(char 
20960 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
20970 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
20980 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
20990 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
209a0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
209b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
209c0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20  mNode->apRegion 
209d0 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69  = apNew;.    whi
209e0 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  le(pShmNode->nRe
209f0 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a  gion<=iRegion){.
20a00 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d        void *pMem
20a10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
20a20 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
20a30 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61        pMem = mma
20a40 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20  p(0, szRegion,. 
20a50 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
20a60 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
20a70 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52  ? PROT_READ : PR
20a80 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49  OT_READ|PROT_WRI
20a90 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  TE, .           
20aa0 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68   MAP_SHARED, pSh
20ab0 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f  mNode->h, pShmNo
20ac0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65  de->nRegion*szRe
20ad0 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a  gion.        );.
20ae0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
20af0 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
20b00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
20b10 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
20b20 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
20b30 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64   "mmap", pShmNod
20b40 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
20b50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
20b60 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
20b70 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
20b80 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  {.        pMem =
20b90 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
20ba0 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
20bb0 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29     if( pMem==0 )
20bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
20bd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
20be0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
20bf0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
20c00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
20c10 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52  set(pMem, 0, szR
20c20 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  egion);.      }.
20c30 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
20c40 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  apRegion[pShmNod
20c50 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d  e->nRegion] = pM
20c60 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  em;.      pShmNo
20c70 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20  de->nRegion++;. 
20c80 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
20c90 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
20ca0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
20cb0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70  Region ){.    *p
20cc0 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  p = pShmNode->ap
20cd0 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b  Region[iRegion];
20ce0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
20cf0 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
20d00 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
20d10 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c  donly && rc==SQL
20d20 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
20d30 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
20d40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
20d50 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
20d60 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
20d70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
20d80 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
20d90 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
20da0 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
20db0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
20dc0 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
20dd0 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20   between SHAREd 
20de0 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  and EXCLUSIVE lo
20df0 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a  cks is a little.
20e00 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72  ** different her
20e10 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e  e than in posix.
20e20 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c    In xShmLock(),
20e30 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d   one can go from
20e40 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20   unlocked.** to 
20e50 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20  shared and back 
20e60 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  or from unlocked
20e70 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e   to exclusive an
20e80 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65  d back.  But one
20e90 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66   may.** not go f
20ea0 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78  rom shared to ex
20eb0 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20  clusive or from 
20ec0 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61  exclusive to sha
20ed0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
20ee0 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a  nt unixShmLock(.
20ef0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
20f00 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
20f10 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
20f20 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
20f30 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
20f40 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
20f50 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
20f60 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
20f70 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
20f80 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
20f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20fa0 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
20fb0 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
20fc0 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
20fd0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
20fe0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
20ff0 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
21000 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
21010 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
21020 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f  File*)fd;      /
21030 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
21040 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
21050 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ry */.  unixShm 
21060 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
21070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21080 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
21090 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
210a0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58  */.  unixShm *pX
210b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
210c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
210d0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
210e0 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
210f0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
21100 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
21110 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e  Node;  /* The un
21120 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e  derlying file iN
21130 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ode */.  int rc 
21140 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
21150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21160 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
21170 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
211a0 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
211b0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
211c0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
211d0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
211e0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
211f0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
21200 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
21210 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
21220 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
21230 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
21240 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
21250 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
21260 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
21270 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
21280 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
21290 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
212a0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
212b0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
212c0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
212d0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
212e0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
212f0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
21300 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
21310 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
21320 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
21330 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
21340 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
21350 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
21360 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
21370 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
21380 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
21390 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
213a0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
213b0 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
213c0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
213d0 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
213e0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
213f0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61  Lock==0 );..  ma
21400 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
21410 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
21420 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
21430 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
21440 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
21450 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
21460 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
21470 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
21480 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
21490 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
214a0 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
214b0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
214c0 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
214d0 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
214e0 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
214f0 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
21500 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
21510 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
21520 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
21530 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
21540 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
21550 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
21560 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
21570 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
21580 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
21590 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
215a0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
215b0 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
215c0 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
215d0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
215e0 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
215f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
21600 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
21610 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
21620 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _UNLCK, ofst+UNI
21630 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
21640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21650 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
21670 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ndo the local lo
21680 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
21690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
216a0 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
216b0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
216c0 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
216d0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20  &= ~mask;.    } 
216e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
216f0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
21700 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
21710 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
21720 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
21730 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
21740 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
21750 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
21760 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
21770 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
21780 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
21790 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
217a0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
217b0 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
217c0 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
217d0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
217e0 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
217f0 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
21800 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
21810 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
21820 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
21830 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
21840 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
21850 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
21860 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21870 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
21880 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21890 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
218a0 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
218b0 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
218c0 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
218d0 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
218e0 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
218f0 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
21900 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21910 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
21920 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
21930 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
21940 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
21950 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
21960 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_RDLCK, ofst+UN
21970 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
21980 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21990 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
219a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
219b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
219c0 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
219d0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
219e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
219f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
21a00 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
21a10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
21a20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
21a30 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
21a40 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
21a50 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
21a60 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
21a70 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
21a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
21a90 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
21aa0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
21ab0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
21ac0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
21ad0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
21ae0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
21af0 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
21b00 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
21b10 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
21b20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
21b30 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
21b40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
21b50 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  .  .    /* Get t
21b60 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
21b70 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
21b80 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
21b90 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
21ba0 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
21bb0 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
21bc0 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
21bd0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
21be0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21bf0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
21c00 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
21c10 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43  pShmNode, F_WRLC
21c20 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
21c30 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
21c40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21c50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
21c60 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
21c70 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
21c80 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
21c90 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
21ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21cb0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
21cc0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
21cd0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
21ce0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73  ACE(("SHM-LOCK s
21cf0 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20  hmid-%d, pid-%d 
21d00 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  got %03x,%03x\n"
21d10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
21d20 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d  id, getpid(), p-
21d30 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
21d40 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
21d50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21d60 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
21d70 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
21d80 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
21d90 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
21da0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
21db0 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
21dc0 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
21dd0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
21de0 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
21df0 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
21e00 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
21e10 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
21e20 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
21e30 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
21e40 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
21e50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
21e60 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
21e70 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
21e80 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
21e90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
21ea0 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
21eb0 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  ex();.  unixLeav
21ec0 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
21ed0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65  ** Close a conne
21ee0 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
21ef0 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20  memory.  Delete 
21f00 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a  the underlying .
21f10 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
21f20 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
21f30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
21f40 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65   is no shared me
21f50 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
21f60 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74  with the connect
21f70 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ion then this.**
21f80 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61   routine is a ha
21f90 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f  rmless no-op..*/
21fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
21fb0 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
21fc0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21fe0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
21ff0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
22000 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65   /* Delete share
22030 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65  d-memory if true
22040 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
22050 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
22060 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22070 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
22080 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69   closed */.  uni
22090 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
220a0 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
220b0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
220c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
220d0 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
220e0 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pp;            
220f0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
22100 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
22110 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
22120 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  /.  unixFile *pD
22130 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  bFd;            
22140 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
22150 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
22160 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20  ile */..  pDbFd 
22170 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
22180 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
22190 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
221a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
221b0 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
221c0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
221d0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
221e0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
221f0 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
22200 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
22210 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
22220 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20  pInode );..  /* 
22230 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
22240 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
22250 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
22260 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
22270 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
22280 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
22290 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
222a0 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
222b0 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
222c0 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
222d0 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
222e0 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
222f0 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
22300 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
22310 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
22320 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
22330 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
22340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
22350 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
22360 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
22370 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
22380 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
22390 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
223a0 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
223b0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
223c0 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72  o */.  unixEnter
223d0 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
223e0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
223f0 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
22400 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
22410 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
22420 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  =0 ){.    if( de
22430 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d  leteFlag && pShm
22440 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73 55  Node->h>=0 ) osU
22450 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e  nlink(pShmNode->
22460 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
22470 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
22480 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Fd);.  }.  unixL
22490 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
224a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
224b0 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65  ;.}...#else.# de
224c0 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20  fine unixShmMap 
224d0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
224e0 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  nixShmLock    0.
224f0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
22500 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
22510 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20  ne unixShmUnmap 
22520 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
22530 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22540 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
22550 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
22560 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
22570 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
22580 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
22590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
225a0 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
225b0 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
225c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
225d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
225e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
225f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
22630 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
22640 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
22650 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
22660 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
22670 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
22680 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
22690 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
226a0 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
226b0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
226c0 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
226d0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
226e0 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
226f0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
22700 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
22710 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
22720 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
22730 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
22740 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
22750 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
22760 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
22770 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
22780 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
22790 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
227a0 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
227b0 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
227c0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
227d0 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
227e0 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
227f0 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
22800 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
22810 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
22820 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
22830 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
22840 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
22850 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
22860 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
22870 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
22880 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
22890 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
228a0 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
228b0 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
228c0 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
228d0 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f  or finder-funtio
228e0 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
228f0 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
22900 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
22910 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
22920 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
22930 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
22940 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
22950 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
22960 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
22970 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
22980 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
22990 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
229a0 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
229b0 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
229c0 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
229d0 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
229e0 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
229f0 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
22a00 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
22a10 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
22a20 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
22a30 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
22a40 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
22a50 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
22a60 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
22a70 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
22a80 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
22a90 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
22aa0 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
22ab0 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
22ac0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
22ad0 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
22ae0 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
22af0 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
22b00 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
22b10 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
22b20 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
22b30 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
22b40 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
22b50 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
22b60 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
22b70 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
22b80 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
22b90 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
22ba0 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
22bb0 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
22bc0 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56  INDER, METHOD, V
22bd0 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c  ERSION, CLOSE, L
22be0 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c  OCK, UNLOCK, CKL
22bf0 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74  OCK)      \.stat
22c00 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
22c10 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
22c20 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
22c50 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
22c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
22c70 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
22ca0 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
22cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
22cc0 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ce0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
22cf0 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
22d00 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
22d10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d30 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
22d40 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
22d50 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
22d60 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
22d90 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
22da0 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
22db0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
22de0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
22df0 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
22e30 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
22e40 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
22e50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e70 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
22f40 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22f60 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
22f70 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
22f80 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
22f90 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
22fb0 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
22fc0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
22fd0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
23000 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
23010 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
23020 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
23030 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
23040 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
23050 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20   unixShmMap,    
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23070 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
230a0 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
230b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
230c0 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
230f0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
23100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
23110 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23130 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
23140 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20  ixShmUnmap      
23150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
23160 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23180 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20          \.};    
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 20 20 20 20 20 20                  
231b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231d0 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
231e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
231f0 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52  _methods *FINDER
23200 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61  ##Impl(const cha
23210 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a  r *z, unixFile *
23220 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44  p){   \.  UNUSED
23230 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55  _PARAMETER(z); U
23240 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
23250 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20       \.  return 
23280 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20  &METHOD;        
23290 20 20 20 20 20 20 20 20 20 20 20 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 5c 0a 7d 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 20 20 20 20 20 20 20 20 20 20                  
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23310 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
23320 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
23330 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49  hods *(*const FI
23340 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72  NDER)(const char
23350 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20  *,unixFile *p)  
23360 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52    \.    = FINDER
23370 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ##Impl;../*.** H
23380 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74  ere are all of t
23390 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
233a0 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f  thods objects fo
233b0 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
233c0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
233d0 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20  ies.  Functions 
233e0 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e  that return poin
233f0 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65  ters to these me
23400 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73  thods.** are als
23410 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f  o created..*/.IO
23420 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78  METHODS(.  posix
23430 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
23440 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
23450 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
23460 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73    posixIoMethods
23470 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
23480 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
23490 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
234a0 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
234c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
234d0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e   enabled */.  un
234e0 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
234f0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
23500 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
23510 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
23520 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
23530 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
23540 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  xUnlock,        
23550 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
23560 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
23570 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
23580 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ock     /* xChec
23590 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
235a0 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
235b0 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ODS(.  nolockIoF
235c0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
235d0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
235e0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f  ion name */.  no
235f0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
23600 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
23610 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
23620 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
23630 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23640 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
23650 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
23660 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  abled */.  noloc
23670 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
23680 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
23690 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
236a0 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
236b0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
236c0 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
236d0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
236e0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
236f0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
23700 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
23710 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck   /* xCheckRe
23720 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
23730 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
23740 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e  (.  dotlockIoFin
23750 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  der,          /*
23760 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
23770 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
23780 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
23790 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
237a0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
237b0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
237c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237d0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
237e0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
237f0 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  ed */.  dotlockC
23800 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
23810 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
23820 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  od */.  dotlockL
23830 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23840 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
23850 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  d */.  dotlockUn
23860 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
23870 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
23880 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  od */.  dotlockC
23890 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
238a0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
238b0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
238c0 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
238d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
238e0 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
238f0 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
23900 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
23910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23920 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
23930 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
23940 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
23950 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
23960 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
23970 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
239a0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
239b0 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c  */.  flockClose,
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
239d0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
239e0 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20  */.  flockLock, 
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a00 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
23a10 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  /.  flockUnlock,
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a30 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
23a40 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52  */.  flockCheckR
23a50 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
23a60 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
23a70 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
23a80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f  .#endif..#if OS_
23a90 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
23aa0 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72  S(.  semIoFinder
23ab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23ac0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
23ad0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49  n name */.  semI
23ae0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
23af0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
23b00 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
23b10 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
23b40 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
23b50 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73  led */.  semClos
23b60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23b70 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
23b80 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b  hod */.  semLock
23b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23ba0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
23bb0 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63  od */.  semUnloc
23bc0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23bd0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
23be0 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63  hod */.  semChec
23bf0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
23c00 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
23c10 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
23c20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
23c30 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
23c40 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
23c50 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
23c60 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
23c70 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  afpIoFinder,    
23c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
23c90 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
23ca0 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68  e */.  afpIoMeth
23cb0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
23cc0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
23cd0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
23ce0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
23d10 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
23d20 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d40 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
23d50 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d70 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
23d80 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23da0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
23db0 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
23dc0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
23dd0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
23de0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
23df0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
23e00 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
23e10 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
23e20 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
23e30 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
23e40 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
23e50 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
23e60 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
23e70 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
23e80 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
23e90 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
23ea0 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
23eb0 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
23ec0 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
23ed0 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
23ee0 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
23ef0 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
23f00 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
23f10 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
23f20 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
23f30 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
23f40 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
23f50 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
23f60 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
23f70 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
23f80 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
23f90 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
23fa0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
23fb0 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
23fc0 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
23fd0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
23fe0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
23ff0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
24000 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
24010 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
24020 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
24030 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
24040 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
24050 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
24060 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
24070 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
24080 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
24090 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
240a0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
240b0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
240c0 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
240d0 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
240e0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
240f0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
24100 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
24110 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
24120 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
24130 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
24140 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
24150 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
24160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
24170 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
24180 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  sabled */.  prox
24190 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
241a0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
241b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
241c0 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
241d0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
241e0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
241f0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
24200 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
24210 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
24220 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
24230 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
24240 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
24250 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
24260 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
24270 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
24280 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
24290 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
242a0 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
242b0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
242c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
242d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
242e0 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
242f0 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24310 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
24320 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
24330 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
24340 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
24350 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
24360 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24380 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
24390 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
243a0 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
243b0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
243c0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
243d0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
243e0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
243f0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
24400 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
24410 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
24420 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
24430 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
24440 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
24450 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
24460 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
24470 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
24480 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
24490 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
244a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
244b0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
244c0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
244d0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
244e0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
244f0 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
24500 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
24510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
24520 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
24530 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
24540 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
24550 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
24560 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
24570 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
24580 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
24590 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
245a0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
245b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
245c0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
245d0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
245e0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
245f0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
24600 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
24610 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
24620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
24630 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
24640 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
24650 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
24660 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
24670 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
24680 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
24690 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
246a0 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
246b0 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
246c0 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
246d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
246e0 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
246f0 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
24700 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
24710 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
24720 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
24730 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
24740 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
24750 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
24760 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
24770 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
24780 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
24790 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
247a0 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
247b0 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
247c0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
247d0 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
247e0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
247f0 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
24800 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
24810 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
24820 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
24830 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
24840 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
24850 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
24860 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
24870 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
24880 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
24890 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
248a0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
248b0 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
248c0 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
248d0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
248e0 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
248f0 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
24900 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
24910 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
24920 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
24930 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
24940 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
24950 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
24960 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
24970 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
24980 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
24990 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
249a0 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
249b0 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
249c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
249d0 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
249e0 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
249f0 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
24a00 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
24a10 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
24a20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
24a30 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
24a40 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
24a50 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
24a60 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
24a70 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
24a80 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
24a90 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
24aa0 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
24ab0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
24ac0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
24ad0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
24ae0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
24af0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
24b00 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
24b10 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
24b20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
24b30 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
24b40 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
24b50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
24b60 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
24b70 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
24b80 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
24b90 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
24ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
24bb0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
24bc0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
24bd0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
24be0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
24bf0 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
24c00 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
24c10 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
24c20 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
24c30 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
24c40 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
24c50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
24c60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24c70 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
24c80 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
24c90 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
24ca0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
24cb0 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
24cc0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
24cd0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
24ce0 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
24cf0 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
24d00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24d10 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
24d20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
24d30 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24d40 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
24d50 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
24d60 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
24d70 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56  ** This is for V
24d80 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  XWorks only..*/.
24d90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
24da0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
24db0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
24dc0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
24dd0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
24de0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
24df0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24e00 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
24e10 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
24e20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62  the open file ob
24e30 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ject */.){.  str
24e40 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
24e50 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
24e60 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
24e70 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
24e80 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
24e90 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
24ea0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
24eb0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
24ec0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
24ed0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
24ee0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
24ef0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20  Methods;.  }..  
24f00 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c  /* Test if fcntl
24f10 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  () is supported 
24f20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74  and use POSIX st
24f30 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20  yle locks..  ** 
24f40 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62  Otherwise fall b
24f50 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64  ack to the named
24f60 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f   semaphore metho
24f70 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  d..  */.  lockIn
24f80 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
24f90 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
24fa0 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
24fb0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
24fc0 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
24fd0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
24fe0 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
24ff0 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
25000 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
25010 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
25020 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
25030 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
25040 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68  eturn &semIoMeth
25050 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
25060 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
25070 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
25080 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
25090 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
250a0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
250b0 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
250c0 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
250d0 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  /* OS_VXWORKS &&
250e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
250f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
25100 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
25110 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
25120 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65  inter to a IO me
25130 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
25140 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66  tion:.*/.typedef
25150 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
25160 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e  o_methods *(*fin
25170 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20  der_type)(const 
25180 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
25190 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.../***********
251a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
251b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
251c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
251d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
251e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
251f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
25200 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
25210 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
25220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
25230 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
25240 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
25250 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
25260 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
25270 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
25280 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
25290 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
252a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
252b0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
252c0 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
252d0 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69  by pId..*/.stati
252e0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78  c int fillInUnix
252f0 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  File(.  sqlite3_
25300 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
25310 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
25320 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  s object */.  in
25330 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
25340 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
25350 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
25360 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
25370 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  ed */.  int sync
25380 44 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Dir,            
25390 2f 2a 20 54 72 75 65 20 74 6f 20 73 79 6e 63 20  /* True to sync 
253a0 64 69 72 65 63 74 6f 72 79 20 6f 6e 20 66 69 72  directory on fir
253b0 73 74 20 73 79 6e 63 20 2a 2f 0a 20 20 73 71 6c  st sync */.  sql
253c0 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20  ite3_file *pId, 
253d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
253e0 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
253f0 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
25400 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
25410 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
25420 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
25430 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
25440 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20  int noLock,     
25450 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20          /* Omit 
25460 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65 20  locking if true 
25470 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  */.  int isDelet
25480 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
25490 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  Delete on close 
254a0 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  if true */.  int
254b0 20 69 73 52 65 61 64 4f 6e 6c 79 20 20 20 20 20   isReadOnly     
254c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
254d0 74 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  the file is open
254e0 65 64 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  ed read-only */.
254f0 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  ){.  const sqlit
25500 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
25510 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
25520 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d  unixFile *pNew =
25530 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64   (unixFile *)pId
25540 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
25550 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
25560 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d  t( pNew->pInode=
25570 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50  =NULL );..  /* P
25580 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74  arameter isDelet
25590 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f  e is only used o
255a0 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72 65  n vxworks. Expre
255b0 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69 74  ss this explicit
255c0 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f  ly .  ** here to
255d0 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65   prevent compile
255e0 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74  r warnings about
255f0 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65   unused paramete
25600 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  rs..  */.  UNUSE
25610 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65  D_PARAMETER(isDe
25620 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55 73 75  lete);..  /* Usu
25630 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46  ally the path zF
25640 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  ilename should n
25650 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65  ot be a relative
25660 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20   pathname. The. 
25670 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73   ** exception is
25680 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
25690 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20  e proxy "conch" 
256a0 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74  file in builds t
256b0 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65  hat.  ** include
256c0 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70 70   the special App
256d0 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  le locking style
256e0 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  s..  */.#if defi
256f0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
25700 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
25710 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
25720 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
25730 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
25740 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c  e[0]=='/' .    |
25750 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  | pVfs->pAppData
25760 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  ==(void*)&autolo
25770 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65  ckIoFinder );.#e
25780 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46  lse.  assert( zF
25790 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
257a0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
257b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
257c0 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72  No locking occur
257d0 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66  s in temporary f
257e0 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
257f0 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c  ( zFilename!=0 |
25800 7c 20 6e 6f 4c 6f 63 6b 20 29 3b 0a 0a 20 20 4f  | noLock );..  O
25810 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
25820 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
25830 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
25840 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
25850 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c  ew->zPath = zFil
25860 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65 6d  ename;.  if( mem
25870 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  cmp(pVfs->zName,
25880 22 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d  "unix-excl",10)=
25890 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
258a0 63 74 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49 58  ctrlFlags = UNIX
258b0 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c  FILE_EXCL;.  }el
258c0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74  se{.    pNew->ct
258d0 72 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  rlFlags = 0;.  }
258e0 0a 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c  .  if( isReadOnl
258f0 79 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  y ){.    pNew->c
25900 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
25910 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d  FILE_RDONLY;.  }
25920 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29  .  if( syncDir )
25930 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
25940 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
25950 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 0a  E_DIRSYNC;.  }..
25960 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
25970 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
25980 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
25990 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
259a0 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
259b0 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b  .    noLock = 1;
259c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
259d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
259e0 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  if..  if( noLock
259f0 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
25a00 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
25a10 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
25a20 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
25a30 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
25a40 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
25a50 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
25a60 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
25a70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25a80 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
25a90 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
25aa0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
25ab0 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
25ac0 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
25ad0 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
25ae0 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
25af0 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
25b00 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
25b10 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
25b20 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
25b30 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
25b40 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
25b50 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
25b60 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
25b70 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
25b80 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
25b90 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
25ba0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
25bb0 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
25bc0 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
25bd0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
25be0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
25bf0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
25c00 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
25c10 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
25c20 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20  .#endif.  ){.   
25c30 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
25c40 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
25c50 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
25c60 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
25c70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
25c90 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
25ca0 63 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f  cured in findIno
25cb0 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  deInfo(), close 
25cc0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
25cd0 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
25ce0 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
25cf0 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
25d00 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49  utex. findInodeI
25d10 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
25d20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
25d30 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
25d40 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
25d50 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
25d60 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
25d70 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
25d80 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
25d90 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
25da0 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
25db0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
25dc0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
25dd0 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
25de0 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
25df0 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
25e00 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
25e10 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
25e20 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
25e30 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
25e40 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
25e50 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
25e60 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
25e70 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65      ** findInode
25e80 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20  Info(). If this 
25e90 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
25ea0 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f  is quite safe to
25eb0 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   close.      ** 
25ec0 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74  handle h - as it
25ed0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
25ee0 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63  hat no posix loc
25ef0 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61  ks will be relea
25f00 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  sed.      ** by 
25f10 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20  doing so..      
25f20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  **.      ** If s
25f30 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73  cenario (a) caus
25f40 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65  ed the error the
25f50 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74  n things are not
25f60 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20   so safe. The.  
25f70 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20      ** implicit 
25f80 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20  assumption here 
25f90 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74  is that if fstat
25fa0 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73  () fails, things
25fb0 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a   are in.      **
25fc0 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20   such bad shape 
25fd0 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20  that dropping a 
25fe0 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73  lock or two does
25ff0 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e  n't matter much.
26000 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
26010 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
26020 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
26030 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  .      h = -1;. 
26040 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
26050 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
26060 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
26070 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
26080 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
26090 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
260a0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
260b0 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
260c0 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
260d0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
260e0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
260f0 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
26100 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
26110 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
26120 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
26130 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
26140 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
26150 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
26160 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
26170 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
26180 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
26190 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
261a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
261b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
261c0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
261d0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
261e0 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
261f0 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
26200 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
26210 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
26220 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
26230 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
26240 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
26250 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
26260 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
26270 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
26280 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
26290 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
262a0 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
262b0 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
262c0 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
262d0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
262e0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
262f0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
26300 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
26310 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26320 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
26330 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
26340 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
26350 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
26360 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
26370 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
26380 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
26390 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
263a0 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
263b0 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
263c0 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
263d0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
263e0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
263f0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
26400 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
26410 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
26420 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
26430 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
26440 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
26450 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
26460 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
26470 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
26480 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
26490 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
264a0 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  ame!=0 );.    nF
264b0 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
264c0 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
264d0 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
264e0 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
264f0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69  lite3_malloc(nFi
26500 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
26510 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
26520 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26530 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
26540 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
26550 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
26560 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65  ename, zLockFile
26570 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53  , "%s" DOTLOCK_S
26580 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65  UFFIX, zFilename
26590 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
265a0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
265b0 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
265c0 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
265d0 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  KS.  else if( pL
265e0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
265f0 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  semIoMethods ){.
26600 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d      /* Named sem
26610 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75  aphore locking u
26620 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
26630 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
26640 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75   be.    ** inclu
26650 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f  ded in the semLo
26660 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20  ckingContext.   
26670 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
26680 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
26690 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
266a0 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
266b0 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28  node);.    if( (
266c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
266d0 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  & (pNew->pInode-
266e0 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
266f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d        char *zSem
26700 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e  Name = pNew->pIn
26710 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  ode->aSemName;. 
26720 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
26730 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
26740 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
26750 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e   zSemName, "/%s.
26760 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sem",.          
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
26780 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  w->pId->zCanonic
26790 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  alName);.      f
267a0 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d  or( n=1; zSemNam
267b0 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20  e[n]; n++ ).    
267c0 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
267d0 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
267e0 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
267f0 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
26800 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
26810 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
26820 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
26830 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
26840 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53  Inode->pSem == S
26850 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  EM_FAILED ){.   
26860 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26870 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
26880 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
26890 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27  emName[0] = '\0'
268a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
268b0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
268c0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
268d0 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74  .  .  pNew->last
268e0 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f  Errno = 0;.#if O
268f0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
26900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26910 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
26920 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
26930 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
26940 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
26950 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   osUnlink(zFilen
26960 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65  ame);.    isDele
26970 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  te = 0;.  }.  pN
26980 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69  ew->isDelete = i
26990 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a  sDelete;.#endif.
269a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
269b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
269c0 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
269d0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
269e0 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NE__);.  }else{.
269f0 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
26a00 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  d = pLockingStyl
26a10 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  e;.    OpenCount
26a20 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65  er(+1);.  }.  re
26a30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26a40 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
26a50 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
26a60 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74   in which to put
26a70 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
26a80 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  ..** If no suita
26a90 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ble temporary fi
26aa0 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e  le directory can
26ab0 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
26ac0 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
26ad0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
26ae0 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f  ixTempFileDir(vo
26af0 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
26b00 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
26b10 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
26b20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
26b30 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
26b40 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
26b50 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20  tmp",.     0    
26b60 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
26b70 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20  inator */.  };. 
26b80 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
26b90 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
26ba0 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
26bb0 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61   *zDir = 0;..  a
26bc0 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
26bd0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
26be0 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  y;.  if( !azDirs
26bf0 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
26c00 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
26c10 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
26c20 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
26c30 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
26c40 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69  ); zDir=azDirs[i
26c50 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  ++]){.    if( zD
26c60 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
26c70 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74  ;.    if( osStat
26c80 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63  (zDir, &buf) ) c
26c90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
26ca0 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
26cb0 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75  _mode) ) continu
26cc0 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63  e;.    if( osAcc
26cd0 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20  ess(zDir, 07) ) 
26ce0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72  continue;.    br
26cf0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
26d00 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zDir;.}../*.**
26d10 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
26d20 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
26d30 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
26d40 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
26d50 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
26d60 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
26d70 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
26d80 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
26d90 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
26da0 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
26db0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
26dc0 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
26dd0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
26de0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
26df0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
26e00 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
26e10 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
26e20 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
26e30 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
26e40 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
26e50 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75  0123456789";.  u
26e60 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a  nsigned int i, j
26e70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
26e80 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zDir;..  /* It's
26e90 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
26ea0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
26eb0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
26ec0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
26ed0 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
26ee0 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
26ef0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
26f00 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
26f10 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
26f20 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
26f30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
26f40 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
26f50 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69  _IOERR );..  zDi
26f60 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
26f70 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69  Dir();.  if( zDi
26f80 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e  r==0 ) zDir = ".
26f90 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  ";..  /* Check t
26fa0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
26fb0 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
26fc0 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
26fd0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
26fe0 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
26ff0 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
27000 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
27010 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
27020 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
27030 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
27040 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20  REFIX) + 17) >= 
27050 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a  (size_t)nBuf ){.
27060 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27070 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
27080 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
27090 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37  snprintf(nBuf-17
270a0 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
270b0 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
270c0 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
270d0 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   j = (int)strlen
270e0 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
270f0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
27100 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
27110 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
27120 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
27130 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
27140 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
27150 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
27160 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
27170 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
27180 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
27190 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
271a0 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
271b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
271c0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
271d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
271e0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
271f0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
27200 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
27210 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
27220 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
27230 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
27240 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
27250 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
27260 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
27270 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
27280 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
27290 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
272a0 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
272b0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
272c0 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
272d0 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
272e0 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
272f0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
27300 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
27310 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
27320 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
27330 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
27340 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
27350 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
27360 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
27370 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
27380 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
27390 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
273a0 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
273b0 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
273c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
273d0 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
273e0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
273f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
27400 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27410 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
27420 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
27430 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
27440 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
27450 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
27460 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
27470 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
27480 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
27490 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
274a0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
274b0 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
274c0 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
274d0 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
274e0 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
274f0 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
27500 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
27510 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
27520 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
27530 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
27540 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
27550 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
27560 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
27570 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
27580 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
27590 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
275a0 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
275b0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
275c0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
275d0 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
275e0 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
275f0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
27600 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
27610 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
27620 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
27630 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
27640 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
27650 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
27660 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
27670 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
27680 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
27690 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
276a0 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
276b0 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
276c0 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
276d0 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
276e0 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
276f0 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
27700 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
27710 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
27720 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
27730 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
27740 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
27750 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
27760 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
27770 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
27780 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
27790 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
277a0 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
277b0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
277c0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
277d0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
277e0 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
277f0 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
27800 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
27810 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
27820 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
27830 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
27840 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
27850 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
27860 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
27870 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
27880 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
27890 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
278a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
278b0 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
278c0 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
278d0 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
278e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
278f0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
27900 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
27910 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
27920 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
27930 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
27940 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
27950 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
27960 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
27970 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
27980 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
27990 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
279a0 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
279b0 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
279c0 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
279d0 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
279e0 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
279f0 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
27a00 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ath, &sStat) ){.
27a10 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66      unixInodeInf
27a20 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20  o *pInode;..    
27a30 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
27a40 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69  ;.    pInode = i
27a50 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68  nodeList;.    wh
27a60 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28  ile( pInode && (
27a70 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64  pInode->fileId.d
27a80 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76  ev!=sStat.st_dev
27a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27aa0 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d        || pInode-
27ab0 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74  >fileId.ino!=sSt
27ac0 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
27ad0 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
27ae0 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
27af0 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
27b00 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
27b10 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
27b20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
27b30 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
27b40 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
27b50 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
27b60 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
27b70 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
27b80 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
27b90 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
27ba0 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
27bb0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
27bc0 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
27bd0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
27be0 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
27bf0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
27c00 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
27c10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
27c20 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
27c30 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f  by unixOpen() to
27c40 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75   determine the u
27c50 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  nix permissions.
27c60 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77  ** to create new
27c70 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20   files with. If 
27c80 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
27c90 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
27ca0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
27cb0 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61  nd a value suita
27cc0 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20  ble for passing 
27cd0 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
27ce0 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29  ument to open(2)
27cf0 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74   is.** written t
27d00 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20  o *pMode. If an 
27d10 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
27d20 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
27d30 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
27d40 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
27d50 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73  lue of *pMode is
27d60 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a   not modified..*
27d70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
27d80 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
27d90 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
27da0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
27db0 63 72 65 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  created with.** 
27dc0 74 68 65 20 6f 63 74 61 6c 20 70 65 72 6d 69 73  the octal permis
27dd0 73 69 6f 6e 73 20 30 36 30 30 20 28 72 65 61 64  sions 0600 (read
27de0 2f 77 72 69 74 61 62 6c 65 20 62 79 20 6f 77 6e  /writable by own
27df0 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65  er only). If the
27e00 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61   file.** is a da
27e10 74 61 62 61 73 65 20 6f 72 20 6d 61 73 74 65 72  tabase or master
27e20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69   journal file, i
27e30 74 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74  t is created wit
27e40 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
27e50 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54  s .** mask SQLIT
27e60 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
27e70 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a  ERMISSIONS..**.*
27e80 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68  * Finally, if th
27e90 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
27ea0 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20  ned is a WAL or 
27eb0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
27ec0 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  file, then .** t
27ed0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65  his function que
27ee0 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  ries the file-sy
27ef0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72  stem for the per
27f00 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
27f10 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
27f20 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
27f30 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  and sets *pMode 
27f40 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  to this value. W
27f50 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73  henever .** poss
27f60 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f  ible, WAL and jo
27f70 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
27f80 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
27f90 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
27fa0 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73  ns .** as the as
27fb0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
27fc0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
27fd0 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
27fe0 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74  LE_8_3_NAMES opt
27ff0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
28000 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67  then the.** orig
28010 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
28020 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42   unavailable.  B
28030 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  ut 8_3_NAMES is 
28040 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a  only used for.**
28050 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73   FAT filesystems
28060 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73   and permissions
28070 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74   do not matter t
28080 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73  here, so just us
28090 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  e.** the default
280a0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f   permissions..*/
280b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
280c0 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a  CreateFileMode(.
280d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
280e0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
280f0 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c    /* Path of fil
28100 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69  e (possibly) bei
28110 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  ng created */.  
28120 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28140 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
28150 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  as 4th argument 
28160 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  to xOpen() */.  
28170 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 20 20 20  mode_t *pMode   
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28190 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69  /* OUT: Permissi
281a0 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ons to open file
281b0 20 77 69 74 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e   with */.){.  in
281c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
281d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
281e0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
281f0 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49 54    *pMode = SQLIT
28200 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
28210 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 69 66  ERMISSIONS;.  if
28220 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
28230 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
28240 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
28250 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NAL) ){.    char
28260 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d   zDb[MAX_PATHNAM
28270 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74  E+1];     /* Dat
28280 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20  abase file path 
28290 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20  */.    int nDb; 
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
282c0 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e  f valid bytes in
282d0 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75   zDb */.    stru
282e0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
282f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
28300 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
28310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
28320 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20  /..    /* zPath 
28330 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57  is a path to a W
28340 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  AL or journal fi
28350 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
28360 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a  g block derives.
28370 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20      ** the path 
28380 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  to the associate
28390 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
283a0 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73  from zPath. This
283b0 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20   block handles. 
283c0 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
283d0 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65  ing naming conve
283e0 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20  ntions:.    **. 
283f0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
28400 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20  o db>-journal". 
28410 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
28420 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a  o db>-wal".    *
28430 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
28440 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20  >-journalNN".   
28450 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
28460 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a  db>-walNN".    *
28470 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
28480 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e  N is a decimal n
28490 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61  umber. The NN na
284a0 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65  ming schemes are
284b0 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79   .    ** used by
284c0 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70   the test_multip
284d0 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20  lex.c module..  
284e0 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73    */.    nDb = s
284f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
28500 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64  Path) - 1; .#ifd
28510 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
28520 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77  _8_3_NAMES.    w
28530 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 21  hile( nDb>0 && !
28540 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
28550 50 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62  Path[nDb]) ) nDb
28560 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d  --;.    if( nDb=
28570 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d  =0 || zPath[nDb]
28580 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53  !='-' ) return S
28590 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
285a0 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
285b0 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20  [nDb]!='-' ){.  
285c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e      assert( nDb>
285d0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
285e0 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  t( zPath[nDb]!='
285f0 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62  \n' );.      nDb
28600 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  --;.    }.#endif
28610 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c  .    memcpy(zDb,
28620 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20   zPath, nDb);.  
28630 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30    zDb[nDb] = '\0
28640 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  ';..    if( 0==o
28650 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61  sStat(zDb, &sSta
28660 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f  t) ){.      *pMo
28670 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f  de = sStat.st_mo
28680 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 7d  de & 0777;.    }
28690 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
286a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
286b0 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  TAT;.    }.  }el
286c0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
286d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
286e0 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20  EONCLOSE ){.    
286f0 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20  *pMode = 0600;. 
28700 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28710 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
28720 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a  e file zPath..**
28730 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c   .** Previously,
28740 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c   the SQLite OS l
28750 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20  ayer used three 
28760 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61  functions in pla
28770 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e  ce of this.** on
28780 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  e:.**.**     sql
28790 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
287a0 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  ite();.**     sq
287b0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
287c0 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  nly();.**     sq
287d0 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
287e0 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  sive();.**.** Th
287f0 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73  ese calls corres
28800 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c  pond to the foll
28810 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
28820 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ns of flags:.**.
28830 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65  **     ReadWrite
28840 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57  () ->     (READW
28850 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a  RITE | CREATE).*
28860 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29  *     ReadOnly()
28870 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e    ->     (READON
28880 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e  LY) .**     Open
28890 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28  Exclusive() -> (
288a0 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
288b0 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a  TE | EXCLUSIVE).
288c0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70  **.** The old Op
288d0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63  enExclusive() ac
288e0 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e  cepted a boolean
288f0 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c   argument - "del
28900 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75  Flag". If.** tru
28910 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  e, the file was 
28920 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65  configured to be
28930 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
28940 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a  eleted when the.
28950 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63  ** file handle c
28960 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76  losed. To achiev
28970 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63  e the same effec
28980 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77  t using this new
28990 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20   .** interface, 
289a0 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e  add the DELETEON
289b0 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68  CLOSE flag to th
289c0 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62  ose specified ab
289d0 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e  ove for .** Open
289e0 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a  Exclusive()..*/.
289f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
28a00 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
28a10 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
28a20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66      /* The VFS f
28a30 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
28a40 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f   the xOpen metho
28a50 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
28a60 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
28a70 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20      /* Pathname 
28a80 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70  of file to be op
28a90 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
28aa0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
28ab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
28ac0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
28ad0 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f   be filled in */
28ae0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74  /* Input flags t
28b10 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70  o control the op
28b20 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a  ening */.  int *
28b30 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
28b40 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
28b50 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  t flags returned
28b60 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20   to SQLite core 
28b70 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
28b80 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20   *p = (unixFile 
28b90 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66  *)pFile;.  int f
28ba0 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
28bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
28bc0 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74  e descriptor ret
28bd0 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20  urned by open() 
28be0 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  */.  int openFla
28bf0 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
28c00 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
28c10 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a  pass to open() *
28c20 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
28c30 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
28c40 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
28c50 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
28c60 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20  int noLock;     
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28c80 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c  * True to omit l
28c90 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
28ca0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
28cb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
28cc0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
28cd0 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
28ce0 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
28cf0 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
28d00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
28d10 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
28d20 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
28d30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
28d40 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
28d50 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
28d60 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
28d70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
28d80 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
28d90 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
28da0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
28db0 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
28dc0 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
28dd0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
28de0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
28df0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
28e00 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
28e10 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78    int isAutoProx
28e20 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  y  = (flags & SQ
28e30 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
28e40 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  OXY);.#endif.#if
28e50 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
28e60 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
28e70 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
28e80 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  LE.  struct stat
28e90 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69  fs fsInfo;.#endi
28ea0 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74  f..  /* If creat
28eb0 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20  ing a master or 
28ec0 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61  main-file journa
28ed0 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
28ee0 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20   will open.  ** 
28ef0 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  a file-descripto
28f00 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f  r on the directo
28f10 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73  ry too. The firs
28f20 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28  t time unixSync(
28f30 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ).  ** is called
28f40 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
28f50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
28f60 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64  ill be fsync()ed
28f70 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20   and close()d.. 
28f80 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
28f90 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  r = (isCreate &&
28fa0 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
28fb0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
28fc0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
28fd0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
28fe0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
28ff0 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
29000 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
29010 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f  N_WAL.  ));..  /
29020 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
29030 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
29040 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
29050 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
29060 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
29070 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
29080 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
29090 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
290a0 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
290b0 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
290c0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
290d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
290e0 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20  Name = zPath;.. 
290f0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
29100 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
29110 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
29120 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
29130 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
29140 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
29150 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
29160 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
29170 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
29180 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
29190 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
291a0 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
291b0 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
291c0 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
291d0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
291e0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
291f0 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
29200 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
29210 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
29220 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
29230 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
29240 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
29250 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
29260 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
29270 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
29280 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
29290 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
292a0 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
292b0 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
292c0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
292d0 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
292e0 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
292f0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
29300 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
29310 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
29320 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
29330 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
29340 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
29350 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
29360 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
29370 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
29380 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
29390 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
293a0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
293b0 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
293c0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
293d0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
293e0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
293f0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
29400 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
29410 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
29420 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
29430 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
29440 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
29450 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
29460 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
29470 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
29480 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
29490 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
294a0 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
294b0 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
294c0 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
294d0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
294e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
294f0 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
29500 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
29510 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
29520 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29530 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
29540 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
29550 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
29560 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
29570 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
29580 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
29590 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
295a0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
295b0 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
295c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
295d0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
295e0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
295f0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
29600 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
29610 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
29620 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d  );..  if( eType=
29630 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
29640 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78  N_DB ){.    Unix
29650 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
29660 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  d;.    pUnused =
29670 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
29680 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20  zName, flags);. 
29690 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
296a0 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e  {.      fd = pUn
296b0 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65  used->fd;.    }e
296c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73  lse{.      pUnus
296d0 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
296e0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  loc(sizeof(*pUnu
296f0 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28  sed));.      if(
29700 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
29710 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29720 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
29730 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  }.    }.    p->p
29740 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
29750 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a  ;.  }else if( !z
29760 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Name ){.    /* I
29770 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c  f zName is NULL,
29780 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
29790 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61   is requesting a
297a0 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20   temp file. */. 
297b0 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65     assert(isDele
297c0 74 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b  te && !syncDir);
297d0 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65  .    rc = unixGe
297e0 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
297f0 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61  THNAME+1, zTmpna
29800 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
29810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29820 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29830 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
29840 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
29850 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
29860 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
29870 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
29880 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20  passed to POSIX 
29890 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70  function.  ** op
298a0 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74  en(). These must
298b0 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65   be calculated e
298c0 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73  ven if open() is
298d0 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a   not called, as.
298e0 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65    ** they may be
298f0 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
29900 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
29910 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74  le and used by t
29920 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20  he .  ** 'conch 
29930 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75  file' locking fu
29940 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e  nctions later on
29950 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65  .  */.  if( isRe
29960 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c  adonly )  openFl
29970 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
29980 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
29990 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  te ) openFlags |
299a0 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20  = O_RDWR;.  if( 
299b0 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70  isCreate )    op
299c0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45  enFlags |= O_CRE
299d0 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c  AT;.  if( isExcl
299e0 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67  usive ) openFlag
299f0 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e  s |= (O_EXCL|O_N
29a00 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e  OFOLLOW);.  open
29a10 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47  Flags |= (O_LARG
29a20 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b  EFILE|O_BINARY);
29a30 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ..  if( fd<0 ){.
29a40 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d      mode_t openM
29a50 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
29a60 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73    /* Permissions
29a70 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20   to create file 
29a80 77 69 74 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d  with */.    rc =
29a90 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
29aa0 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  ode(zName, flags
29ab0 2c 20 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  , &openMode);.  
29ac0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29ad0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
29ae0 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64  ert( !p->pUnused
29af0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
29b00 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
29b10 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70  OPEN_WAL || eTyp
29b20 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
29b30 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
29b40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29b50 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72      }.    fd = r
29b60 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
29b70 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
29b80 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52  nMode);.    OSTR
29b90 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d  ACE(("OPENX   %-
29ba0 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64  3d %s 0%o\n", fd
29bb0 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  , zName, openFla
29bc0 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64  gs));.    if( fd
29bd0 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53  <0 && errno!=EIS
29be0 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69  DIR && isReadWri
29bf0 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
29c00 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  ve ){.      /* F
29c10 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  ailed to open th
29c20 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f  e file for read/
29c30 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72  write access. Tr
29c40 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a  y read-only. */.
29c50 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
29c60 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
29c70 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
29c80 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
29c90 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e    openFlags &= ~
29ca0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29  (O_RDWR|O_CREAT)
29cb0 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
29cc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
29cd0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65  DONLY;.      ope
29ce0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
29cf0 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64  LY;.      isRead
29d00 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  only = 1;.      
29d10 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
29d20 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
29d30 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
29d40 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30    }.    if( fd<0
29d50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
29d60 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
29d70 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
29d80 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29  , "open", zName)
29d90 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
29da0 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
29db0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
29dc0 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
29dd0 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
29de0 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
29df0 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
29e00 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ->pUnused ){.   
29e10 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20   p->pUnused->fd 
29e20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e  = fd;.    p->pUn
29e30 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
29e40 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
29e50 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
29e60 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
29e70 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
29e80 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  lse.    osUnlink
29e90 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
29ea0 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
29eb0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
29ec0 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
29ed0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
29ee0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
29ef0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 46 44 5f  ndif..#ifdef FD_
29f00 43 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63 6e 74  CLOEXEC.  osFcnt
29f10 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f  l(fd, F_SETFD, o
29f20 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
29f30 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
29f40 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  XEC);.#endif..  
29f50 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d  noLock = eType!=
29f60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29f70 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66  _DB;..  .#if def
29f80 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
29f90 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
29fa0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
29fb0 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
29fc0 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
29fd0 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
29fe0 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45  e*)pFile)->lastE
29ff0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2a000 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2a010 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2a020 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a030 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
2a040 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20  .  }.  if (0 == 
2a050 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c  strncmp("msdos",
2a060 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65   fsInfo.f_fstype
2a070 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20  name, 5)) {.    
2a080 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
2a090 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53  e)->fsFlags |= S
2a0a0 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
2a0b0 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64  _MSDOS;.  }.#end
2a0c0 69 66 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45  if.  .#if SQLITE
2a0d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a0e0 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45  STYLE.#if SQLITE
2a0f0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2a100 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72  CKING.  isAutoPr
2a110 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  oxy = 1;.#endif.
2a120 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78    if( isAutoProx
2a130 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c  y && (zPath!=NUL
2a140 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20  L) && (!noLock) 
2a150 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29  && pVfs->xOpen )
2a160 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66  {.    char *envf
2a170 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53  orce = getenv("S
2a180 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2a190 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20  Y_LOCKING");.   
2a1a0 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20   int useProxy = 
2a1b0 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  0;..    /* SQLIT
2a1c0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2a1d0 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66  CKING==1 means f
2a1e0 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20  orce always use 
2a1f0 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a  proxy, 0 means .
2a200 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65      ** never use
2a210 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61   proxy, NULL mea
2a220 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72  ns use proxy for
2a230 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73   non-local files
2a240 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69   only.  */.    i
2a250 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c  f( envforce!=NUL
2a260 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72  L ){.      usePr
2a270 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f  oxy = atoi(envfo
2a280 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73  rce)>0;.    }els
2a290 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61  e{.      if( sta
2a2a0 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e  tfs(zPath, &fsIn
2a2b0 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
2a2c0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
2a2d0 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29  y, the close(fd)
2a2e0 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74   call is sub-opt
2a2f0 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c  imal. If the fil
2a300 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20  e opened.       
2a310 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20 61   ** with fd is a
2a320 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2a330 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f 74  and there are ot
2a340 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
2a350 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
2a360 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
2a370 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
2a380 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79  holding advisory
2a390 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20   locks on it,.  
2a3a0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
2a3b0 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28  e call to close(
2a3c0 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68  ) will cancel th
2a3d0 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72  ose locks. In pr
2a3e0 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20  actice,.        
2a3f0 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e  ** we're assumin
2a400 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29 20  g that statfs() 
2a410 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72  doesn't fail ver
2a420 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73  y often. At leas
2a430 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  t.        ** not
2a440 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c   while other fil
2a450 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
2a460 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  ened by the same
2a470 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20   process on.    
2a480 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
2a490 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  file are working
2a4a0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d  .  */.        p-
2a4b0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2a4c0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  no;.        robu
2a4d0 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
2a4e0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2a4f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2a500 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
2a510 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2a520 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
2a530 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
2a540 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
2a550 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
2a560 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
2a570 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
2a580 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2a590 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 73 79 6e  le(pVfs, fd, syn
2a5a0 63 44 69 72 2c 20 70 46 69 6c 65 2c 20 7a 50 61  cDir, pFile, zPa
2a5b0 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20  th, noLock,.    
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5d0 20 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20        isDelete, 
2a5e0 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20  isReadonly);.   
2a5f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a600 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a610 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
2a620 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69  ormUnixFile((uni
2a630 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a  xFile*)pFile, ":
2a640 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20  auto:");.       
2a650 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2a670 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65  /* Use unixClose
2a680 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65   to clean up the
2a690 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64   resources added
2a6a0 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69   in fillInUnixFi
2a6b0 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le .          **
2a6c0 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74   and clear all t
2a6d0 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72  he structure's r
2a6e0 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63  eferences.  Spec
2a6f0 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20  ifically, .     
2a700 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70       ** pFile->p
2a710 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20  Methods will be 
2a720 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f  NULL so sqlite3O
2a730 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61  sClose will be a
2a740 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20   no-op .        
2a750 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
2a760 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b  nixClose(pFile);
2a770 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2a780 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2a790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
2a7a0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
2a7b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2a7c0 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  if.  .  rc = fil
2a7d0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
2a7e0 2c 20 66 64 2c 20 73 79 6e 63 44 69 72 2c 20 70  , fd, syncDir, p
2a7f0 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c  File, zPath, noL
2a800 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
2a810 20 20 20 20 20 20 20 20 20 20 20 69 73 44 65 6c             isDel
2a820 65 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29  ete, isReadonly)
2a830 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ;.open_finished:
2a840 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2a850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2a860 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75  te3_free(p->pUnu
2a870 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
2a880 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2a890 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
2a8a0 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
2a8b0 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
2a8c0 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
2a8d0 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
2a8e0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
2a8f0 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
2a900 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2a910 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
2a920 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2a930 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
2a940 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
2a950 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
2a960 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2a970 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2a980 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
2a990 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
2a9a0 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a9c0 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
2a9d0 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
2a9e0 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
2a9f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
2aa00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
2aa10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2aa20 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
2aa30 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
2aa40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
2aa50 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55  LETE);.  if( osU
2aa60 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d  nlink(zPath)==(-
2aa70 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f  1) && errno!=ENO
2aa80 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ENT ){.    retur
2aa90 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
2aaa0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
2aab0 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50  TE, "unlink", zP
2aac0 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ath);.  }.#ifnde
2aad0 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2aae0 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64  _DIRSYNC.  if( d
2aaf0 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e  irSync ){.    in
2ab00 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f  t fd;.    rc = o
2ab10 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a  sOpenDirectory(z
2ab20 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20  Path, &fd);.    
2ab30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ab40 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  K ){.#if OS_VXWO
2ab50 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73  RKS.      if( fs
2ab60 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65  ync(fd)==-1 ).#e
2ab70 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73  lse.      if( fs
2ab80 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66  ync(fd) ).#endif
2ab90 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2aba0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2abb0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
2abc0 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e  DIR_FSYNC, "fsyn
2abd0 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  c", zPath);.    
2abe0 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74    }.      robust
2abf0 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
2ac00 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
2ac10 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2ac20 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
2ac30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ac40 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  OK;.    }.  }.#e
2ac50 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
2ac60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
2ac70 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
2ac80 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69   or access permi
2ac90 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a  ssions of file z
2aca0 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73  Path. The.** tes
2acb0 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65  t performed depe
2acc0 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
2acd0 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
2ace0 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
2acf0 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72  SS_EXISTS: Retur
2ad00 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
2ad10 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51  exists.**     SQ
2ad20 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
2ad30 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20  WRITE: Return 1 
2ad40 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
2ad50 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65  ead and writable
2ad60 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  ..**     SQLITE_
2ad70 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a  ACCESS_READONLY:
2ad80 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2ad90 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c   file is readabl
2ada0 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
2adb0 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  se return 0..*/.
2adc0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41  static int unixA
2add0 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
2ade0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
2adf0 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74   /* The VFS cont
2ae00 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63  aining this xAcc
2ae10 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ess method */.  
2ae20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2ae30 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20  h,      /* Path 
2ae40 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65  of the file to e
2ae50 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  xamine */.  int 
2ae60 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2ae70 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77      /* What do w
2ae80 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20  e want to learn 
2ae90 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20  about the zPath 
2aea0 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a  file? */.  int *
2aeb0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
2aec0 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
2aed0 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20  lt boolean here 
2aee0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64  */.){.  int amod
2aef0 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  e = 0;.  UNUSED_
2af00 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2af10 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
2af20 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2af30 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
2af40 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  S; );.  switch( 
2af50 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
2af60 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
2af70 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d  EXISTS:.      am
2af80 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20  ode = F_OK;.    
2af90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2afa0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
2afb0 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
2afc0 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f   amode = W_OK|R_
2afd0 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
2afe0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2aff0 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
2b000 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b      amode = R_OK
2b010 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
2b020 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
2b030 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
2b040 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
2b050 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
2b060 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73  sOut = (osAccess
2b070 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d  (zPath, amode)==
2b080 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d  0);.  if( flags=
2b090 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
2b0a0 58 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75  XISTS && *pResOu
2b0b0 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
2b0c0 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66  stat buf;.    if
2b0d0 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74  ( 0==osStat(zPat
2b0e0 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e  h, &buf) && buf.
2b0f0 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  st_size==0 ){.  
2b100 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30      *pResOut = 0
2b110 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2b120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b130 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  }.../*.** Turn a
2b140 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
2b150 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
2b160 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
2b170 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
2b180 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
2b190 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
2b1a0 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
2b1b0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
2b1c0 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
2b1d0 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
2b1e0 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
2b1f0 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
2b200 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
2b210 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
2b220 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
2b230 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
2b240 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
2b250 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
2b260 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
2b270 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
2b280 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
2b290 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
2b2a0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2b2b0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2b2c0 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
2b2d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2b2e0 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
2b2f0 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
2b300 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
2b310 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b330 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2b340 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
2b350 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
2b360 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
2b370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2b380 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
2b390 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
2b3a0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
2b3b0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
2b3c0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
2b3d0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
2b3e0 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
2b3f0 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
2b400 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
2b410 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
2b420 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
2b430 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
2b440 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
2b450 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
2b460 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
2b470 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
2b480 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  y has been unlin
2b490 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ked..  */.  Simu
2b4a0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2b4b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2b4c0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
2b4d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d  Vfs->mxPathname=
2b4e0 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b  =MAX_PATHNAME );
2b4f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b500 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f  TER(pVfs);..  zO
2b510 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30  ut[nOut-1] = '\0
2b520 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  ';.  if( zPath[0
2b530 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71  ]=='/' ){.    sq
2b540 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2b550 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c  Out, zOut, "%s",
2b560 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65   zPath);.  }else
2b570 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a  {.    int nCwd;.
2b580 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64      if( osGetcwd
2b590 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d  (zOut, nOut-1)==
2b5a0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
2b5b0 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
2b5c0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2b5d0 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a  KPT, "getcwd", z
2b5e0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
2b5f0 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72   nCwd = (int)str
2b600 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73  len(zOut);.    s
2b610 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2b620 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74  nOut-nCwd, &zOut
2b630 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a  [nCwd], "/%s", z
2b640 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Path);.  }.  ret
2b650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b660 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2b670 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
2b680 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
2b690 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
2b6a0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
2b6b0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
2b6c0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
2b6d0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
2b6e0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
2b6f0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
2b700 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c  ibrary..*/.#incl
2b710 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74  ude <dlfcn.h>.st
2b720 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
2b730 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
2b740 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73  s *NotUsed, cons
2b750 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2b760 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
2b770 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2b780 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e  .  return dlopen
2b790 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44  (zFilename, RTLD
2b7a0 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42  _NOW | RTLD_GLOB
2b7b0 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  AL);.}../*.** SQ
2b7c0 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
2b7d0 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  function immedia
2b7e0 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c  tely after a cal
2b7f0 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29  l to unixDlSym()
2b800 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65   or.** unixDlOpe
2b810 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72  n() fails (retur
2b820 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  ns a null pointe
2b830 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65  r). If a more de
2b840 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20  tailed error.** 
2b850 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c  message is avail
2b860 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74  able, it is writ
2b870 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20  ten to zBufOut. 
2b880 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73  If no error mess
2b890 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  age.** is availa
2b8a0 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20  ble, zBufOut is 
2b8b0 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20  left unmodified 
2b8c0 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20  and SQLite uses 
2b8d0 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72  a default.** err
2b8e0 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
2b8f0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
2b900 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
2b910 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
2b920 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2b930 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  fOut){.  const c
2b940 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
2b950 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2b960 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
2b970 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
2b980 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
2b990 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
2b9a0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2b9b0 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
2b9c0 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
2b9d0 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
2b9e0 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
2b9f0 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
2ba00 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2ba10 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
2ba20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
2ba30 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
2ba40 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
2ba50 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
2ba60 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
2ba70 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
2ba80 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
2ba90 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
2baa0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
2bab0 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
2bac0 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
2bad0 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
2bae0 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
2baf0 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
2bb00 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
2bb10 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
2bb20 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
2bb30 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
2bb40 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
2bb50 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
2bb60 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
2bb70 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
2bb80 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
2bb90 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
2bba0 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
2bbb0 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
2bbc0 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
2bbd0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
2bbe0 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
2bbf0 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
2bc00 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
2bc10 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
2bc20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
2bc30 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
2bc40 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
2bc50 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
2bc60 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
2bc70 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
2bc80 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
2bc90 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
2bca0 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
2bcb0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
2bcc0 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
2bcd0 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
2bce0 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
2bcf0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
2bd00 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
2bd10 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
2bd20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
2bd30 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
2bd40 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
2bd50 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
2bd60 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
2bd70 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
2bd80 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
2bd90 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
2bda0 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
2bdb0 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
2bdc0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2bdd0 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
2bde0 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
2bdf0 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
2be00 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
2be10 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
2be20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
2be30 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
2be40 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
2be50 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
2be60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2be70 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
2be80 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
2be90 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
2bea0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
2beb0 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
2bec0 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
2bed0 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
2bee0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
2bef0 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
2bf00 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
2bf10 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
2bf20 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
2bf30 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
2bf40 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
2bf50 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
2bf60 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
2bf70 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
2bf80 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
2bf90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2bfa0 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
2bfb0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
2bfc0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2bfd0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
2bfe0 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
2bff0 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
2c000 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
2c010 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
2c020 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
2c030 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
2c040 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
2c050 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
2c060 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
2c070 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
2c080 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
2c090 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
2c0a0 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
2c0b0 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
2c0c0 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
2c0d0 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
2c0e0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
2c0f0 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
2c100 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
2c110 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
2c120 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
2c130 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
2c140 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
2c150 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
2c160 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
2c170 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
2c180 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
2c190 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
2c1a0 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
2c1b0 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
2c1c0 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
2c1d0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
2c1e0 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
2c1f0 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
2c200 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
2c210 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
2c220 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
2c230 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
2c240 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
2c250 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
2c260 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
2c270 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
2c280 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
2c290 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20  , 0, nBuf);.#if 
2c2a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2c2b0 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e  TEST).  {.    in
2c2c0 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66  t pid, fd;.    f
2c2d0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
2c2e0 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
2c2f0 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20  O_RDONLY, 0);.  
2c300 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2c310 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20      time_t t;.  
2c320 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20      time(&t);.  
2c330 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c      memcpy(zBuf,
2c340 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b   &t, sizeof(t));
2c350 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74  .      pid = get
2c360 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d  pid();.      mem
2c370 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
2c380 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  (t)], &pid, size
2c390 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20  of(pid));.      
2c3a0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74  assert( sizeof(t
2c3b0 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28  )+sizeof(pid)<=(
2c3c0 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20  size_t)nBuf );. 
2c3d0 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65       nBuf = size
2c3e0 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70  of(t) + sizeof(p
2c3f0 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
2c400 20 20 20 20 20 20 64 6f 7b 20 6e 42 75 66 20 3d        do{ nBuf =
2c410 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66   osRead(fd, zBuf
2c420 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28  , nBuf); }while(
2c430 20 6e 42 75 66 3c 30 20 26 26 20 65 72 72 6e 6f   nBuf<0 && errno
2c440 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20  ==EINTR );.     
2c450 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c   robust_close(0,
2c460 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
2c470 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2c480 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
2c490 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
2c4a0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
2c4b0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
2c4c0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
2c4d0 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
2c4e0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
2c4f0 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
2c500 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
2c510 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
2c520 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
2c530 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
2c540 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
2c550 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
2c560 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
2c570 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
2c580 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
2c590 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
2c5a0 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
2c5b0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
2c5c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
2c5d0 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
2c5e0 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
2c5f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c600 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
2c610 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2c620 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
2c630 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
2c640 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
2c650 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76  pec sp;..  sp.tv
2c660 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f  _sec = microseco
2c670 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20  nds / 1000000;. 
2c680 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d   sp.tv_nsec = (m
2c690 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30  icroseconds % 10
2c6a0 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20  00000) * 1000;. 
2c6b0 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20   nanosleep(&sp, 
2c6c0 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f  NULL);.  UNUSED_
2c6d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2c6e0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
2c6f0 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66  roseconds;.#elif
2c700 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
2c710 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
2c720 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
2c730 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  croseconds);.  U
2c740 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2c750 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
2c760 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
2c770 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
2c780 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
2c790 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
2c7a0 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
2c7b0 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
2c7c0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2c7d0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ed);.  return se
2c7e0 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
2c7f0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
2c800 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2c810 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
2c820 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
2c830 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
2c840 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
2c850 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
2c860 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
2c870 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
2c880 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
2c890 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
2c8a0 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
2c8b0 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
2c8c0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
2c8d0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2c8e0 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
2c8f0 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
2c900 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
2c910 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
2c920 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
2c930 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
2c940 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
2c950 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
2c960 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
2c970 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
2c980 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
2c990 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
2c9a0 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
2c9b0 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
2c9c0 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
2c9d0 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
2c9e0 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
2c9f0 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
2ca00 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
2ca10 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
2ca20 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
2ca30 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
2ca40 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
2ca50 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
2ca60 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
2ca70 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
2ca80 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2ca90 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  OK.  Return SQLI
2caa0 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20  TE_ERROR if the 
2cab0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a  time and date .*
2cac0 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  * cannot be foun
2cad0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2cae0 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
2caf0 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
2cb00 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69  s *NotUsed, sqli
2cb10 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
2cb20 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2cb30 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2cb40 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
2cb50 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
2cb60 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69  t64)8640000;.  i
2cb70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cb80 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  K;.#if defined(N
2cb90 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65  O_GETTOD).  time
2cba0 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29  _t t;.  time(&t)
2cbb0 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73  ;.  *piNow = ((s
2cbc0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a  qlite3_int64)t)*
2cbd0 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68  1000 + unixEpoch
2cbe0 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52  ;.#elif OS_VXWOR
2cbf0 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
2cc00 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f  spec sNow;.  clo
2cc10 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b  ck_gettime(CLOCK
2cc20 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77  _REALTIME, &sNow
2cc30 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e  );.  *piNow = un
2cc40 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28  ixEpoch + 1000*(
2cc50 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e  sqlite3_int64)sN
2cc60 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77  ow.tv_sec + sNow
2cc70 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30  .tv_nsec/1000000
2cc80 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
2cc90 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20   timeval sNow;. 
2cca0 20 69 66 28 20 67 65 74 74 69 6d 65 6f 66 64 61   if( gettimeofda
2ccb0 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20 29  y(&sNow, 0)==0 )
2ccc0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 75  {.    *piNow = u
2ccd0 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
2cce0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
2ccf0 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
2cd00 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a  w.tv_usec/1000;.
2cd10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2cd20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2cd30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
2cd40 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2cd50 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
2cd60 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
2cd70 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
2cd80 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
2cd90 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2cda0 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
2cdb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
2cdc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2cdd0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
2cde0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
2cdf0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2ce00 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2ce10 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2ce20 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
2ce30 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
2ce40 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
2ce50 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
2ce60 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
2ce70 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
2ce80 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
2ce90 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
2cea0 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2ceb0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
2cec0 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
2ced0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2cee0 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
2cef0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2cf00 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
2cf10 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2cf20 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2cf30 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e   rc = unixCurren
2cf40 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69  tTimeInt64(0, &i
2cf50 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  );.  *prNow = i/
2cf60 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65  86400000.0;.  re
2cf70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2cf80 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20 78  * We added the x
2cf90 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d  GetLastError() m
2cfa0 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20 69  ethod with the i
2cfb0 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76  ntention of prov
2cfc0 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20  iding.** better 
2cfd0 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
2cfe0 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70  messages when op
2cff0 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70  erating-system p
2d000 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a  roblems come up.
2d010 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ** during SQLite
2d020 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
2d030 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66   so far, none of
2d040 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 69   that has been i
2d050 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e  mplemented.** in
2d060 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74   the core.  So t
2d070 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
2d080 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f  ever called.  Fo
2d090 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72  r now, it is mer
2d0a0 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68  ely.** a place-h
2d0b0 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  older..*/.static
2d0c0 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74   int unixGetLast
2d0d0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2d0e0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2d0f0 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a  NotUsed2, char *
2d100 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55  NotUsed3){.  UNU
2d110 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2d120 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44  tUsed);.  UNUSED
2d130 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2d140 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2);.  UNUSED_P
2d150 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2d160 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  3);.  return 0;.
2d170 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../*.*********
2d180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2d190 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  End of sqlite3_v
2d1a0 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
2d1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2d1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d210 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
2d220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d260 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2d270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d280 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c  ** Begin Proxy L
2d290 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
2d2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72  *******.**.** Pr
2d2c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
2d2d0 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d   "uber-locking-m
2d2e0 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73  ethod" in this s
2d2f0 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74  ense:  It uses t
2d300 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  he.** other lock
2d310 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73  ing methods on s
2d320 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69  econdary lock fi
2d330 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b  les.  Proxy lock
2d340 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61  ing is a.** meta
2d350 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20  -layer over top 
2d360 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  of the primitive
2d370 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
2d380 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72  nted above.  For
2d390 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  .** this reason,
2d3a0 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
2d3b0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66  at implements of
2d3c0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
2d3d0 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e  s deferred.** un
2d3e0 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20  til late in the 
2d3f0 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65  file (here) afte
2d400 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68  r all of the oth
2d410 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68  er I/O methods h
2d420 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69  ave.** been defi
2d430 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68  ned - so that th
2d440 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
2d450 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20  ing methods are 
2d460 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20  available.** as 
2d470 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70  services to help
2d480 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d   with the implem
2d490 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78  entation of prox
2d4a0 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  y locking..**.**
2d4b0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  **.**.** The def
2d4c0 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68  ault locking sch
2d4d0 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75  emes in SQLite u
2d4e0 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  se byte-range lo
2d4f0 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  cks on the.** da
2d500 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
2d510 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20  oordinate safe, 
2d520 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73  concurrent acces
2d530 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65  s by multiple re
2d540 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69  aders.** and wri
2d550 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c  ters [http://sql
2d560 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76  ite.org/lockingv
2d570 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69  3.html].  The fi
2d580 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  ve file locking.
2d590 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43  ** states (UNLOC
2d5a0 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48  KED, PENDING, SH
2d5b0 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
2d5c0 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69  EXCLUSIVE) are i
2d5d0 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73  mplemented.** as
2d5e0 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72   POSIX read & wr
2d5f0 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66  ite locks over f
2d600 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61  ixed set of loca
2d610 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c  tions (via fsctl
2d620 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64  ),.** on AFP and
2d630 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73   SMB only exclus
2d640 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  ive byte-range l
2d650 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62  ocks are availab
2d660 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20  le via fsctl.** 
2d670 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20  with _IOWR('z', 
2d680 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
2d690 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20  angeLockPB2) to 
2d6a0 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35  track the same 5
2d6b0 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73   states..** To s
2d6c0 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43  imulate a F_RDLC
2d6d0 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  K on the shared 
2d6e0 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20  range, on AFP a 
2d6f0 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
2d700 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20  d.** address in 
2d710 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
2d720 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20   is taken for a 
2d730 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
2d740 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65   entire.** share
2d750 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
2d760 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56   for an EXCLUSIV
2d770 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20  E lock):.**.**  
2d780 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
2d790 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
2d7a0 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20  00..   ..**     
2d7b0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
2d7c0 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
2d7d0 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
2d7e0 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
2d7f0 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
2d800 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
2d810 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
2d820 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
2d830 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
2d840 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
2d850 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
2d860 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
2d870 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
2d880 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
2d890 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
2d8a0 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
2d8b0 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
2d8c0 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
2d8d0 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
2d8e0 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
2d8f0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
2d900 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
2d910 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
2d920 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
2d930 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
2d940 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
2d950 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
2d960 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
2d970 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
2d980 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
2d990 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
2d9a0 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
2d9b0 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
2d9c0 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
2d9d0 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
2d9e0 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
2d9f0 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
2da00 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
2da10 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
2da20 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
2da30 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
2da40 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
2da50 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
2da60 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
2da70 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
2da80 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
2da90 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
2daa0 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
2dab0 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
2dac0 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
2dad0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
2dae0 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
2daf0 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
2db00 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
2db10 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
2db20 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
2db30 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
2db40 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
2db50 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
2db60 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
2db70 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
2db80 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
2db90 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
2dba0 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
2dbb0 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
2dbc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
2dbd0 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
2dbe0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
2dbf0 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
2dc00 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
2dc10 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
2dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc30 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74        <proxy_pat
2dc40 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  h> | ":auto:");.
2dc50 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
2dc60 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
2dc70 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ame, SQLITE_GET_
2dc80 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26  LOCKPROXYFILE, &
2dc90 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
2dca0 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
2dcb0 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
2dcc0 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
2dcd0 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
2dce0 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
2dcf0 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
2dd00 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
2dd10 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
2dd20 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
2dd30 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
2dd40 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
2dd50 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
2dd60 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
2dd70 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
2dd80 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
2dd90 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
2dda0 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
2ddb0 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
2ddc0 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
2ddd0 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
2dde0 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
2ddf0 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2de00 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
2de10 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
2de20 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
2de30 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
2de40 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
2de50 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
2de60 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2de70 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
2de80 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
2de90 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
2dea0 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
2deb0 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
2dec0 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
2ded0 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
2dee0 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
2def0 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
2df00 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
2df10 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
2df20 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
2df30 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
2df40 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
2df50 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
2df60 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
2df70 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
2df80 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
2df90 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
2dfa0 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
2dfb0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
2dfc0 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
2dfd0 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
2dfe0 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
2dff0 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
2e000 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
2e010 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
2e020 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
2e030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
2e040 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
2e050 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
2e060 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
2e070 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
2e080 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
2e090 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
2e0a0 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
2e0b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e0c0 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
2e0d0 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
2e0e0 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
2e0f0 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
2e100 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
2e110 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
2e120 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
2e130 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
2e140 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
2e150 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
2e160 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
2e170 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
2e180 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
2e190 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
2e1a0 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
2e1b0 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
2e1c0 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
2e1d0 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
2e1e0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
2e1f0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
2e200 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
2e210 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
2e220 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
2e230 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
2e240 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
2e250 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
2e260 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
2e270 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
2e280 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
2e290 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
2e2a0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
2e2b0 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
2e2c0 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
2e2d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e2e0 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
2e2f0 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
2e300 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
2e310 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
2e320 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63  exist, or it's c
2e330 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
2e340 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
2e350 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
2e360 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
2e370 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
2e380 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
2e390 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
2e3a0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
2e3b0 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
2e3c0 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
2e3d0 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
2e3e0 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
2e3f0 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
2e400 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
2e410 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
2e420 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
2e430 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
2e440 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
2e450 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
2e460 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
2e470 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
2e480 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
2e490 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
2e4a0 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
2e4b0 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
2e4c0 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
2e4d0 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
2e4e0 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
2e4f0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
2e500 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
2e510 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
2e520 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
2e530 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e540 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
2e550 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
2e560 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
2e570 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
2e580 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
2e590 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
2e5a0 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
2e5b0 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65  le)..**.** Reque
2e5c0 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70  sting the lock p
2e5d0 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d  roxy does not im
2e5e0 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74  mediately take t
2e5f0 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a  he conch, it is.
2e600 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68  ** only taken wh
2e610 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71  en the first req
2e620 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74  uest to lock dat
2e630 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61  abase file is ma
2e640 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61  de.  .** This ma
2e650 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74  tches the semant
2e660 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69  ics of the tradi
2e670 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62  tional locking b
2e680 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a  ehavior, where.*
2e690 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e  * opening a conn
2e6a0 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
2e6b0 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e  base file does n
2e6c0 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f  ot take a lock o
2e6d0 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61  n it..** The sha
2e6e0 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20  red lock and an 
2e6f0 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
2e700 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69  ptor are maintai
2e710 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68  ned until .** th
2e720 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
2e730 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2e740 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  closed. .**.** T
2e750 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e  he proxy file an
2e760 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  d the lock file 
2e770 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65  are never delete
2e780 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e  d so they only n
2e790 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65  eed.** to be cre
2e7a0 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74  ated the first t
2e7b0 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65  ime they are use
2e7c0 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  d..**.** Configu
2e7d0 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a  ration options.*
2e7e0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
2e7f0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53  -------.**.**  S
2e800 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
2e810 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a  XY_LOCKING.**.**
2e820 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20         Database 
2e830 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f  files accessed o
2e840 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  n non-local file
2e850 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20   systems are.** 
2e860 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61        automatica
2e870 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  lly configured f
2e880 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
2e890 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65  , lock files are
2e8a0 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20  .**       named 
2e8b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73  automatically us
2e8c0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67  ing the same log
2e8d0 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50  ic as.**       P
2e8e0 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79  RAGMA lock_proxy
2e8f0 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a  _file=":auto:".*
2e900 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45  *    .**  SQLITE
2e910 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a  _PROXY_DEBUG.**.
2e920 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73  **       Enables
2e930 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20   the logging of 
2e940 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64  error messages d
2e950 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69  uring host id fi
2e960 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72  le.**       retr
2e970 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69  ieval and creati
2e980 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52  on.**.**  LOCKPR
2e990 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20  OXYDIR.**.**    
2e9a0 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65     Overrides the
2e9b0 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
2e9c0 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
2e9d0 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61   proxy files tha
2e9e0 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e  t.**       are n
2e9f0 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
2ea00 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74  ly via the ":aut
2ea10 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a  o:" setting.**.*
2ea20 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  *  SQLITE_DEFAUL
2ea30 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
2ea40 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20  SSIONS.**.**    
2ea50 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74     Permissions t
2ea60 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
2ea70 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
2ea80 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a  for storing the.
2ea90 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72  **       lock pr
2eaa0 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20  oxy files, only 
2eab0 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52  used when LOCKPR
2eac0 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65  OXYDIR is not se
2ead0 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  t..**    .**    
2eae0 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64  .** As mentioned
2eaf0 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d   above, when com
2eb00 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
2eb10 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2eb20 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69  OCKING,.** setti
2eb30 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  ng the environme
2eb40 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49  nt variable SQLI
2eb50 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
2eb60 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c  OCKING to 1 will
2eb70 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20  .** force proxy 
2eb80 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73  locking to be us
2eb90 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  ed for every dat
2eba0 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65  abase file opene
2ebb0 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c  d, and 0.** will
2ebc0 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63   force automatic
2ebd0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
2ebe0 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f  o be disabled fo
2ebf0 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
2ec00 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69  * files (explici
2ec10 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ty calling the S
2ec20 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
2ec30 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f  OXYFILE pragma o
2ec40 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65  r.** sqlite_file
2ec50 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20  _control API is 
2ec60 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20  not affected by 
2ec70 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
2ec80 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a  XY_LOCKING)..*/.
2ec90 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  ./*.** Proxy loc
2eca0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
2ecb0 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
2ecc0 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
2ecd0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2ece0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2ecf0 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
2ed00 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
2ed10 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
2ed20 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
2ed30 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
2ed40 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
2ed50 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
2ed60 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
2ed70 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
2ed80 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2ed90 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2eda0 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
2edb0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2edc0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
2edd0 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
2ede0 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
2edf0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
2ee00 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
2ee10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2ee20 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2ee30 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
2ee40 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
2ee50 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
2ee60 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
2ee70 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
2ee80 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
2ee90 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
2eea0 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
2eeb0 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
2eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eed0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
2eee0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
2eef0 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
2ef00 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20          /* 1 if 
2ef10 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c  the conch is hel
2ef20 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73  d, -1 if lockles
2ef30 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
2ef40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
2ef50 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
2ef60 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
2ef70 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
2ef80 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
2ef90 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
2efa0 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
2efb0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
2efc0 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
2efd0 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
2efe0 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
2eff0 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
2f000 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
2f010 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
2f020 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
2f030 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
2f040 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
2f050 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
2f060 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
2f070 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
2f080 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
2f090 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
2f0a0 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
2f0b0 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
2f0c0 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
2f0d0 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
2f0e0 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
2f0f0 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
2f100 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
2f110 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
2f120 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
2f130 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
2f140 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
2f150 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
2f160 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
2f170 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
2f180 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
2f190 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
2f1a0 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
2f1b0 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
2f1c0 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
2f1d0 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
2f1e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2f1f0 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
2f200 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
2f210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f220 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
2f230 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  }.    len = strl
2f240 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
2f250 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
2f260 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c  n);    .  }.# el
2f270 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
2f280 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
2f290 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
2f2a0 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
2f2b0 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
2f2c0 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
2f2d0 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
2f2e0 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
2f2f0 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
2f300 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
2f310 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
2f320 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
2f330 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
2f340 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
2f350 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
2f360 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d  (i+len+7)<(int)m
2f370 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  axLen; i++){.   
2f380 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68   char c = dbPath
2f390 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69  [i];.    lPath[i
2f3a0 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29  +len] = (c=='/')
2f3b0 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50  ?'_':c;.  }.  lP
2f3c0 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b  ath[i+len]='\0';
2f3d0 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68  .  strlcat(lPath
2f3e0 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c  , ":auto:", maxL
2f3f0 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  en);.  OSTRACE((
2f400 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72  "GETLOCKPATH  pr
2f410 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
2f420 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
2f430 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
2f440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f450 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72  K;.}../* . ** Cr
2f460 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66  eates the lock f
2f470 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73  ile and any miss
2f480 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20  ing directories 
2f490 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a  in lockPath. */.
2f4a0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2f4b0 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63  CreateLockPath(c
2f4c0 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50  onst char *lockP
2f4d0 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c  ath){.  int i, l
2f4e0 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d  en;.  char buf[M
2f4f0 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e  AXPATHLEN];.  in
2f500 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a  t start = 0;.  .
2f510 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74    assert(lockPat
2f520 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74  h!=NULL);.  /* t
2f530 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c  ry to create all
2f540 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
2f550 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f  e directories */
2f560 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  .  len = (int)st
2f570 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a  rlen(lockPath);.
2f580 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50    buf[0] = lockP
2f590 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69  ath[0];.  for( i
2f5a0 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29  =1; i<len; i++ )
2f5b0 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61  {.    if( lockPa
2f5c0 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[i] == '/' && 
2f5d0 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20  (i - start > 0) 
2f5e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  ){.      /* only
2f5f0 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64   mkdir if leaf d
2f600 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22  ir != "." or "/"
2f610 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20   or ".." */.    
2f620 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20    if( i-start>2 
2f630 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26  || (i-start==1 &
2f640 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
2f650 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
2f660 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20  ] != '/') .     
2f670 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d      || (i-start=
2f680 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =2 && buf[start]
2f690 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
2f6a0 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20  tart+1] != '.') 
2f6b0 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69  ){.        buf[i
2f6c0 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  ]='\0';.        
2f6d0 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c 20 53  if( mkdir(buf, S
2f6e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
2f6f0 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
2f700 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NS) ){.         
2f710 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
2f720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
2f730 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20  r!=EEXIST ) {.  
2f740 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
2f750 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
2f760 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61 74  TH  FAILED creat
2f770 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20  ing %s, ".      
2f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2f790 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20  '%s' proxy lock 
2f7a0 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
2f7b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2f7c0 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74 72          buf, str
2f7d0 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b  error(err), lock
2f7e0 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
2f7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
2f800 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20  turn err;.      
2f810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2f820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
2f830 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  art=i+1;.    }. 
2f840 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b     buf[i] = lock
2f850 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f  Path[i];.  }.  O
2f860 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c  STRACE(("CREATEL
2f870 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
2f880 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
2f890 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c  %d\n", lockPath,
2f8a0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72   getpid()));.  r
2f8b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2f8c0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
2f8d0 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
2f8e0 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
2f8f0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
2f900 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
2f910 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
2f920 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
2f930 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
2f940 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
2f950 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
2f960 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
2f970 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
2f980 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
2f990 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
2f9a0 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
2f9b0 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
2f9c0 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
2f9d0 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
2f9e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2f9f0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
2fa00 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2fa10 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
2fa20 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
2fa30 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
2fa40 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
2fa50 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
2fa60 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
2fa70 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
2fa80 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
2fa90 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
2faa0 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
2fab0 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
2fac0 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
2fad0 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
2fae0 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   -1;.  unixFile 
2faf0 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20  *pNew;.  int rc 
2fb00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2fb10 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
2fb20 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
2fb30 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64  .  sqlite3_vfs d
2fb40 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74  ummyVfs;.  int t
2fb50 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69  errno = 0;.  Uni
2fb60 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2fb70 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a  ed = NULL;..  /*
2fb80 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f   1. first try to
2fb90 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
2fba0 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66   file.  ** 2. if
2fbb0 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64   that fails, and
2fbc0 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20   this is a lock 
2fbd0 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29  file (not-conch)
2fbe0 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20  , try creating. 
2fbf0 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64   ** the parent d
2fc00 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74  irectories and t
2fc10 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20  hen try again.. 
2fc20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66   ** 3. if that f
2fc30 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65  ails, try to ope
2fc40 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d  n the file read-
2fc50 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77  only.  ** otherw
2fc60 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20  ise return BUSY 
2fc70 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f  (if lock file) o
2fc80 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74  r CANTOPEN for t
2fc90 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20  he conch file.  
2fca0 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66  */.  pUnused = f
2fcb0 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61  indReusableFd(pa
2fcc0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  th, openFlags);.
2fcd0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
2fce0 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65  .    fd = pUnuse
2fcf0 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d->fd;.  }else{.
2fd00 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
2fd10 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
2fd20 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
2fd30 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
2fd40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2fd50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2fd60 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
2fd70 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20  d<0 ){.    fd = 
2fd80 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
2fd90 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
2fda0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2fdb0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2fdc0 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
2fdd0 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  o;.    if( fd<0 
2fde0 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  && errno==ENOENT
2fdf0 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29   && islockfile )
2fe00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78  {.      if( prox
2fe10 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
2fe20 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f  path) == SQLITE_
2fe30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64  OK ){.        fd
2fe40 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
2fe50 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
2fe60 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2fe70 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
2fe80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2fe90 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
2fea0 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20  {.    openFlags 
2feb0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
2fec0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2fed0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2fee0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2fef0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2ff00 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
2ff10 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
2ff20 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66  ( fd<0 ){.    if
2ff30 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  ( islockfile ){.
2ff40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ff50 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
2ff60 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72      switch (terr
2ff70 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  no) {.      case
2ff80 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20   EACCES:.       
2ff90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2ffa0 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ERM;.      case 
2ffb0 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65  EIO: .        re
2ffc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2ffd0 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20  R_LOCK; /* even 
2ffe0 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65  though it is the
2fff0 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20   conch */.      
30000 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
30010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
30020 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
30030 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65    }.  }.  .  pNe
30040 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
30050 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
30060 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
30070 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
30080 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
30090 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
300a0 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72  to end_create_pr
300b0 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  oxy;.  }.  memse
300c0 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
300d0 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
300e0 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  pNew->openFlags 
300f0 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d  = openFlags;.  m
30100 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c  emset(&dummyVfs,
30110 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
30120 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66  Vfs));.  dummyVf
30130 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f  s.pAppData = (vo
30140 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
30150 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66  inder;.  dummyVf
30160 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79  s.zName = "dummy
30170 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64  ";.  pUnused->fd
30180 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64   = fd;.  pUnused
30190 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  ->flags = openFl
301a0 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e  ags;.  pNew->pUn
301b0 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
301c0 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e    .  rc = fillIn
301d0 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56  UnixFile(&dummyV
301e0 66 73 2c 20 66 64 2c 20 30 2c 20 28 73 71 6c 69  fs, fd, 0, (sqli
301f0 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20  te3_file*)pNew, 
30200 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  path, 0, 0, 0);.
30210 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30220 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
30230 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
30240 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30250 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
30260 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
30270 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
30280 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
30290 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
302a0 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
302b0 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
302c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
302d0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
302e0 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
302f0 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
30300 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
30310 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
30320 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
30330 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
30340 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
30350 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
30360 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
30370 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
30380 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61  gth */../* Not a
30390 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e  lways defined in
303a0 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20   the headers as 
303b0 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a  it ought to be *
303c0 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
303d0 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20  hostuuid(uuid_t 
303e0 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74  id, const struct
303f0 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29   timespec *wait)
30400 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  ;../* get the ho
30410 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
30420 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
30430 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
30440 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
30450 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
30460 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
30470 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
30480 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
30490 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
304a0 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
304b0 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
304c0 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
304d0 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
304e0 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
304f0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
30500 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  N);.#if defined(
30510 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49  __MAX_OS_X_VERSI
30520 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29  ON_MIN_REQUIRED)
30530 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
30540 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56   && __MAC_OS_X_V
30550 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
30560 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20  RED<1050.  {.   
30570 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
30580 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
30590 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
305a0 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
305b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68   */.    if( geth
305c0 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c  ostuuid(pHostID,
305d0 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20   &timeout) ){.  
305e0 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
305f0 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rno;.      if( p
30600 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
30610 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a   *pError = err;.
30620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
30630 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
30640 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
30650 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
30660 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23  METER(pError);.#
30670 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
30680 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69  ITE_TEST.  /* si
30690 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
306a0 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
306b0 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
306c0 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20  file paths */.  
306d0 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  if( sqlite3_host
306e0 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20  id_num != 0){.  
306f0 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28    pHostID[0] = (
30700 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d  char)(pHostID[0]
30710 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65   + (char)(sqlite
30720 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30  3_hostid_num & 0
30730 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  xFF));.  }.#endi
30740 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  f.  .  return SQ
30750 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
30760 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
30770 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65  ntains the heade
30780 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c  r, host id and l
30790 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a  ock file path. *
307a0 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
307b0 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20  CONCHVERSION 2  
307c0 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65   /* 1-byte heade
307d0 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20  r, 16-byte host 
307e0 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66  id, path */.#def
307f0 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52  ine PROXY_HEADER
30800 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f  LEN    1   /* co
30810 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20  nch file header 
30820 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e  length */.#defin
30830 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  e PROXY_PATHINDE
30840 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44  X    (PROXY_HEAD
30850 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
30860 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50  IDLEN).#define P
30870 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
30880 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c    (PROXY_HEADERL
30890 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
308a0 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a  EN+MAXPATHLEN)..
308b0 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  /* .** Takes an 
308c0 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c  open conch file,
308d0 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74   copies the cont
308e0 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61  ents to a new pa
308f0 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65  th and then move
30900 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20  s .** it back.  
30910 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65  The newly create
30920 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65  d file's file de
30930 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69  scriptor is assi
30940 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63  gned to the.** c
30950 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74  onch file struct
30960 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  ure and finally 
30970 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
30980 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
30990 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64  or is .** closed
309a0 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20  .  Returns zero 
309b0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
309c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
309d0 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b  xyBreakConchLock
309e0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
309f0 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
30a00 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  D){.  proxyLocki
30a10 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
30a20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
30a30 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
30a40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
30a50 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
30a60 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
30a70 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72  onchFile;.  char
30a80 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45   tPath[MAXPATHLE
30a90 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50  N];.  char buf[P
30aa0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
30ab0 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68  ];.  char *cPath
30ac0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
30ad0 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74  lePath;.  size_t
30ae0 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20   readLen = 0;.  
30af0 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d  size_t pathLen =
30b00 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73   0;.  char errms
30b10 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e  g[64] = "";.  in
30b20 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  t fd = -1;.  int
30b30 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53   rc = -1;.  UNUS
30b40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48  ED_PARAMETER(myH
30b50 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72  ostID);..  /* cr
30b60 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20  eate a new path 
30b70 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74  by replace the t
30b80 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27  railing '-conch'
30b90 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a   with '-break' *
30ba0 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74  /.  pathLen = st
30bb0 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61  rlcpy(tPath, cPa
30bc0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
30bd0 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d  .  if( pathLen>M
30be0 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74  AXPATHLEN || pat
30bf0 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20  hLen<6 || .     
30c00 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b  (strlcpy(&tPath[
30c10 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65  pathLen-5], "bre
30c20 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b  ak", 6) != 5) ){
30c30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
30c40 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
30c50 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74  msg),errmsg,"pat
30c60 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  h error (len %d)
30c70 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b  ",(int)pathLen);
30c80 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
30c90 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f  eaklock;.  }.  /
30ca0 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68  * read the conch
30cb0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65   content */.  re
30cc0 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  adLen = osPread(
30cd0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75  conchFile->h, bu
30ce0 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
30cf0 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20  HLEN, 0);.  if( 
30d00 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41  readLen<PROXY_PA
30d10 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73  THINDEX ){.    s
30d20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
30d30 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
30d40 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f  rrmsg,"read erro
30d50 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
30d60 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67  )readLen);.    g
30d70 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
30d80 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74  k;.  }.  /* writ
30d90 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20  e it out to the 
30da0 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20  temporary break 
30db0 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72  file */.  fd = r
30dc0 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68  obust_open(tPath
30dd0 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  , (O_RDWR|O_CREA
30de0 54 7c 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20 20  T|O_EXCL),.     
30df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
30e00 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
30e10 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
30e20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
30e30 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30e40 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
30e50 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61  ), errmsg, "crea
30e60 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
30e70 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
30e80 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
30e90 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72  .  }.  if( osPwr
30ea0 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61  ite(fd, buf, rea
30eb0 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69  dLen, 0) != (ssi
30ec0 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a  ze_t)readLen ){.
30ed0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30ee0 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
30ef0 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72  sg), errmsg, "wr
30f00 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ite failed (%d)"
30f10 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
30f20 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
30f30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61  ;.  }.  if( rena
30f40 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29  me(tPath, cPath)
30f50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
30f60 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
30f70 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c  errmsg), errmsg,
30f80 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20   "rename failed 
30f90 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
30fa0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
30fb0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  klock;.  }.  rc 
30fc0 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  = 0;.  fprintf(s
30fd0 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74  tderr, "broke st
30fe0 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e  ale lock on %s\n
30ff0 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62  ", cPath);.  rob
31000 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
31010 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f   conchFile->h, _
31020 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63  _LINE__);.  conc
31030 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20  hFile->h = fd;. 
31040 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e   conchFile->open
31050 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
31060 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62   O_CREAT;..end_b
31070 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20  reaklock:.  if( 
31080 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64  rc ){.    if( fd
31090 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  >=0 ){.      osU
310a0 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20  nlink(tPath);.  
310b0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
310c0 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49  (pFile, fd, __LI
310d0 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NE__);.    }.   
310e0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
310f0 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61   "failed to brea
31100 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20  k stale lock on 
31110 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68  %s, %s\n", cPath
31120 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20  , errmsg);.  }. 
31130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31140 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75 65  * Take the reque
31150 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sted lock on the
31160 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20   conch file and 
31170 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f  break a stale lo
31180 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ck if the .** ho
31190 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a  st id matches..*
311a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
311b0 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78  xyConchLock(unix
311c0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69  File *pFile, uui
311d0 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e  d_t myHostID, in
311e0 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70  t lockType){.  p
311f0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
31200 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
31210 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
31220 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
31230 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78  Context; .  unix
31240 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
31250 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
31260 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
31270 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
31280 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72  Tries = 0;.  str
31290 75 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e  uct timespec con
312a0 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20  chModTime;.  .  
312b0 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64  memset(&conchMod
312c0 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Time, 0, sizeof(
312d0 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a  conchModTime));.
312e0 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
312f0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
31300 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
31310 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
31320 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20  le, lockType);. 
31330 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20     nTries ++;.  
31340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31350 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f  _BUSY ){.      /
31360 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61  * If the lock fa
31370 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20  iled (busy):.   
31380 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67      * 1st try: g
31390 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  et the mod time 
313a0 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61  of the conch, wa
313b0 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20  it 0.5s and try 
313c0 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a  again. .       *
313d0 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69   2nd try: fail i
313e0 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63  f the mod time c
313f0 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69  hanged or host i
31400 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20  d is different, 
31410 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20  wait .       *  
31420 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63 20           10 sec 
31430 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20  and try again.  
31440 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20       * 3rd try: 
31450 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75  break the lock u
31460 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69  nless the mod ti
31470 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a  me has changed..
31480 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31490 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
314a0 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
314b0 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  at(conchFile->h,
314c0 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20   &buf) ){.      
314d0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
314e0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
314f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31500 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
31510 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
31520 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31     if( nTries==1
31530 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63   ){.        conc
31540 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73  hModTime = buf.s
31550 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20  t_mtimespec;.   
31560 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30       usleep(5000
31570 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35  00); /* wait 0.5
31580 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
31590 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20   lock again*/.  
315a0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
315b0 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
315c0 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e   assert( nTries>
315d0 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  1 );.      if( c
315e0 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73  onchModTime.tv_s
315f0 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
31600 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c  mespec.tv_sec ||
31610 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68   .         conch
31620 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20  ModTime.tv_nsec 
31630 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
31640 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20  pec.tv_nsec ){. 
31650 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
31660 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
31670 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
31680 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b  if( nTries==2 ){
31690 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20    .        char 
316a0 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  tBuf[PROXY_MAXCO
316b0 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
316c0 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65   int len = osPre
316d0 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
316e0 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58   tBuf, PROXY_MAX
316f0 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
31700 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20        if( len<0 
31710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
31720 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
31730 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
31740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
31750 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
31760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
31770 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49   len>PROXY_PATHI
31780 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d  NDEX && tBuf[0]=
31790 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e  =(char)PROXY_CON
317a0 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20  CHVERSION){.    
317b0 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
317c0 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66  reak the lock if
317d0 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65   the host id doe
317e0 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20  sn't match */.  
317f0 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d          if( 0!=m
31800 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58  emcmp(&tBuf[PROX
31810 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
31820 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f  HostID, PROXY_HO
31830 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20  STIDLEN) ){.    
31840 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31850 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
31860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31880 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
31890 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72  the lock on shor
318a0 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73  t read or a vers
318b0 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a  ion mismatch */.
318c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
318d0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
318e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
318f0 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29  usleep(10000000)
31900 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63  ; /* wait 10 sec
31910 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63   and try the loc
31920 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  k again */.     
31930 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20     continue; .  
31940 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
31950 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65     assert( nTrie
31960 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  s==3 );.      if
31970 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43  ( 0==proxyBreakC
31980 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
31990 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20  myHostID) ){.   
319a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
319b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
319c0 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55   lockType==EXCLU
319d0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
319e0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
319f0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
31a00 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
31a10 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
31a20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20  SHARED_LOCK);   
31a30 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
31a40 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72  }.        if( !r
31a50 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
31a60 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
31a70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
31a80 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
31a90 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
31aa0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
31ab0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77     }.    }.  } w
31ac0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
31ad0 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c  _BUSY && nTries<
31ae0 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  3 );.  .  return
31af0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73   rc;.}../* Takes
31b00 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61   the conch by ta
31b10 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  king a shared lo
31b20 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20  ck and read the 
31b30 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20  contents conch, 
31b40 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  if .** lockPath 
31b50 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
31b60 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63   host ID and loc
31b70 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74  k file path must
31b80 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20   match.  A NULL 
31b90 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61  .** lockPath mea
31ba0 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ns that the lock
31bb0 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  Path in the conc
31bc0 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
31bd0 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  sed if the .** h
31be0 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f  ost IDs match, o
31bf0 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74  r a new lock pat
31c00 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  h will be genera
31c10 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
31c20 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65  y .** and writte
31c30 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66  n to the conch f
31c40 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
31c50 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  nt proxyTakeConc
31c60 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
31c70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
31c80 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
31c90 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
31ca0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
31cb0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
31cc0 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  .  .  if( pCtx->
31cd0 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a  conchHeld!=0 ){.
31ce0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31cf0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
31d00 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
31d10 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
31d20 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75  onchFile;.    uu
31d30 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20  id_t myHostID;. 
31d40 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20     int pError = 
31d50 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64  0;.    char read
31d60 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
31d70 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
31d80 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54   lockPath[MAXPAT
31d90 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
31da0 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20  *tempLockPath = 
31db0 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63  NULL;.    int rc
31dc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31dd0 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63    int createConc
31de0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68  h = 0;.    int h
31df0 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a  ostIdMatch = 0;.
31e00 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20      int readLen 
31e10 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79  = 0;.    int try
31e20 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
31e30 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65  .    int forceNe
31e40 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  wLockPath = 0;. 
31e50 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28     .    OSTRACE(
31e60 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
31e70 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
31e80 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
31e90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
31ea0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
31eb0 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
31ec0 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
31ed0 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b  :"), getpid()));
31ee0 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  ..    rc = proxy
31ef0 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74  GetHostID(myHost
31f00 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20  ID, &pError);.  
31f10 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
31f20 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
31f30 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
31f40 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72  stErrno = pError
31f50 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
31f60 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
31f70 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  }.    rc = proxy
31f80 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
31f90 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45   myHostID, SHARE
31fa0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
31fb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31fc0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
31fd0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
31fe0 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68  }.    /* read th
31ff0 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68  e existing conch
32000 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61   file */.    rea
32010 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65  dLen = seekAndRe
32020 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f  ad((unixFile*)co
32030 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64  nchFile, 0, read
32040 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
32050 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28  NCHLEN);.    if(
32060 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20   readLen<0 ){.  
32070 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72      /* I/O error
32080 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  : lastErrno set 
32090 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
320a0 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  /.      pFile->l
320b0 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68  astErrno = conch
320c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
320d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
320e0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
320f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
32100 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c  keconch;.    }el
32110 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d  se if( readLen<=
32120 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
32130 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
32140 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
32150 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28     readBuf[0]!=(
32160 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
32170 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20  VERSION ){.     
32180 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64   /* a short read
32190 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d   or version form
321a0 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e  at mismatch mean
321b0 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  s we need to cre
321c0 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20  ate a new .     
321d0 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20   ** conch file. 
321e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
321f0 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b  createConch = 1;
32200 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66  .    }.    /* if
32210 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74   the host id mat
32220 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  ches and the loc
32230 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65  k path already e
32240 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e  xists in the con
32250 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20  ch.    ** we'll 
32260 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 70  try to use the p
32270 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 65  ath there, if we
32280 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74   can't open that
32290 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20   path, we'll .  
322a0 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20    ** retry with 
322b0 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72  a new auto-gener
322c0 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a  ated path .    *
322d0 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e  /.    do { /* in
322e0 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f   case we need to
322f0 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61   try again for a
32300 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c  n :auto: named l
32310 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ock file */..   
32320 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43 6f     if( !createCo
32330 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77  nch && !forceNew
32340 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
32350 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20      hostIdMatch 
32360 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42  = !memcmp(&readB
32370 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  uf[PROXY_HEADERL
32380 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a  EN], myHostID, .
32390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323b0 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45    PROXY_HOSTIDLE
323c0 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69  N);.        /* i
323d0 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20  f the conch has 
323e0 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65  data compare the
323f0 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20   contents */.   
32400 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
32410 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
32420 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f  .          /* fo
32430 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63  r auto-named loc
32440 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75  al lock file, ju
32450 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73  st check the hos
32460 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20  t ID and we'll. 
32470 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
32480 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
32490 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73  file path that's
324a0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72   already in ther
324b0 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e.           */.
324c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68 6f            if( ho
324d0 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20  stIdMatch ){.   
324e0 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20           size_t 
324f0 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c  pathLen = (readL
32500 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49  en - PROXY_PATHI
32510 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20  NDEX);.         
32520 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
32530 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58  if( pathLen>=MAX
32540 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20  PATHLEN ){.     
32550 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e           pathLen
32560 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20  =MAXPATHLEN-1;. 
32570 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
32580 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
32590 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42  lockPath, &readB
325a0 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  uf[PROXY_PATHIND
325b0 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20  EX], pathLen);. 
325c0 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50             lockP
325d0 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30  ath[pathLen] = 0
325e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
325f0 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63  mpLockPath = loc
32600 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20  kPath;.         
32610 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74     tryOldLockPat
32620 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
32630 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63     /* create a c
32640 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  opy of the lock 
32650 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63  path if the conc
32660 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  h is taken */.  
32670 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32680 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
32690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
326a0 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74    }else if( host
326b0 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20  IdMatch.        
326c0 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e 63         && !strnc
326d0 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  mp(pCtx->lockPro
326e0 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75 66  xyPath, &readBuf
326f0 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
32700 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
32710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
32720 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48  adLen-PROXY_PATH
32730 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20 29  INDEX).        )
32740 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  {.          /* c
32750 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f  onch host and lo
32760 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f  ck path match */
32770 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
32780 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a  end_takeconch; .
32790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
327a0 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
327b0 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  * if the conch i
327c0 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e  sn't writable an
327d0 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c  d doesn't match,
327e0 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69   we can't take i
327f0 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  t */.      if( (
32800 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
32810 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20  lags&O_RDWR) == 
32820 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
32830 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
32840 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
32850 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
32860 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
32870 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 6f  /* either the co
32880 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68  nch didn't match
32890 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63   or we need to c
328a0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
328b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  */.      if( !pC
328c0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
328d0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f  h ){.        pro
328e0 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43  xyGetLockPath(pC
328f0 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b  tx->dbPath, lock
32900 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
32910 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c  );.        tempL
32920 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61  ockPath = lockPa
32930 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  th;.        /* c
32940 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
32950 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f  the lock path _o
32960 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63  nly_ if the conc
32970 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  h is taken */.  
32980 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
32990 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e     /* update con
329a0 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64  ch with host and
329b0 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c   path (this will
329c0 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70   fail if other p
329d0 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20  rocess.      ** 
329e0 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
329f0 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74  k already), if t
32a00 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  he host id match
32a10 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a  es, use the big.
32a20 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a        ** stick..
32a30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
32a40 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65  utimes(conchFile
32a50 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ->h, NULL);.    
32a60 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63    if( hostIdMatc
32a70 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63  h && !createConc
32a80 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  h ){.        if(
32a90 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f   conchFile->pIno
32aa0 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d  de && conchFile-
32ab0 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
32ac0 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
32ad0 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
32ae0 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
32af0 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
32b00 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
32b10 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s.           ** 
32b20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
32b30 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
32b40 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
32b50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
32b60 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
32b70 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20      } else {    
32b80 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
32b90 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68   rc = proxyConch
32ba0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
32bb0 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f  stID, EXCLUSIVE_
32bc0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  LOCK);.        }
32bd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32be0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
32bf0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
32c00 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
32c10 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45  le*)conchFile, E
32c20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
32c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32c40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32c50 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
32c60 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
32c70 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
32c80 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69 74          int writ
32c90 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  eSize = 0;.     
32ca0 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69 74     .        writ
32cb0 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68  eBuffer[0] = (ch
32cc0 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
32cd0 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d  RSION;.        m
32ce0 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66 66  emcpy(&writeBuff
32cf0 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  er[PROXY_HEADERL
32d00 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50  EN], myHostID, P
32d10 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
32d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
32d30 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
32d40 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
32d50 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69      strlcpy(&wri
32d60 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
32d70 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d  ATHINDEX], pCtx-
32d80 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
32d90 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
32da0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32db0 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77        strlcpy(&w
32dc0 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
32dd0 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d  _PATHINDEX], tem
32de0 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41  pLockPath, MAXPA
32df0 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  THLEN);.        
32e00 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 53  }.        writeS
32e10 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48  ize = PROXY_PATH
32e20 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26  INDEX + strlen(&
32e30 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
32e40 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20  Y_PATHINDEX]);. 
32e50 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 66 74         robust_ft
32e60 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c  runcate(conchFil
32e70 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29  e->h, writeSize)
32e80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  ;.        rc = u
32e90 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74 65  nixWrite((sqlite
32ea0 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69  3_file *)conchFi
32eb0 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c  le, writeBuffer,
32ec0 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a   writeSize, 0);.
32ed0 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f          fsync(co
32ee0 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  nchFile->h);.   
32ef0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72       /* If we cr
32f00 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63  eated a new conc
32f10 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74  h file (not just
32f20 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e   updated the con
32f30 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20  tents of a .    
32f40 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f       ** valid co
32f50 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74  nch file), try t
32f60 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d  o match the perm
32f70 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64  issions of the d
32f80 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 20  atabase .       
32f90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
32fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
32fb0 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b  & createConch ){
32fc0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
32fd0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
32fe0 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
32ff0 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
33000 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20  , &buf);.       
33010 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b     if( err==0 ){
33020 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64  .            mod
33030 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e  e_t cmode = buf.
33040 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52  st_mode&(S_IRUSR
33050 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47  |S_IWUSR | S_IRG
33060 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20  RP|S_IWGRP |.   
33070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33090 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49       S_IROTH|S_I
330a0 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20  WOTH);.         
330b0 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74     /* try to mat
330c0 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ch the database 
330d0 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73  file R/W permiss
330e0 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69  ions, ignore fai
330f0 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  lure */.#ifndef 
33100 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
33110 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  UG.            o
33120 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c  sFchmod(conchFil
33130 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65  e->h, cmode);.#e
33140 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  lse.            
33150 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  do{.            
33160 20 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28    rc = osFchmod(
33170 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d  conchFile->h, cm
33180 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ode);.          
33190 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d    }while( rc==(-
331a0 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  1) && errno==EIN
331b0 54 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TR );.          
331c0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
331d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
331e0 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20   code = errno;. 
331f0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72               fpr
33200 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
33210 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77  hmod %o FAILED w
33220 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ith %d %s\n",.  
33230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33240 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c      cmode, code,
33250 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29   strerror(code))
33260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
33270 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
33280 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
33290 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
332a0 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64  SUCCEDED\n",cmod
332b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
332c0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
332d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
332e0 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  nt code = errno;
332f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
33300 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54  intf(stderr, "ST
33310 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69  AT FAILED[%d] wi
33320 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20  th %d %s\n", .  
33330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33340 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72    err, code, str
33350 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65  error(code));.#e
33360 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d  ndif.          }
33370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33380 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69   }.      conchFi
33390 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
333a0 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
333b0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
333c0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
333d0 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65     .    end_take
333e0 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53 54  conch:.      OST
333f0 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
33400 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c  Y: CLOSE  %d\n",
33410 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
33420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33430 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f  E_OK && pFile->o
33440 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  penFlags ){.    
33450 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
33460 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68      if( pFile->h
33470 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
33480 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
33490 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f  ile, pFile->h, _
334a0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
334b0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69 6c    }.        pFil
334c0 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20  e->h = -1;.     
334d0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
334e0 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68  pen(pCtx->dbPath
334f0 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  , pFile->openFla
33500 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
33510 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
33520 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
33530 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
33540 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52      OSTRACE(("TR
33550 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20  ANSPROXY: OPEN  
33560 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20  %d\n", fd));.   
33570 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29       if( fd>=0 )
33580 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
33590 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20  e->h = fd;.     
335a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
335b0 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41      rc=SQLITE_CA
335c0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20  NTOPEN_BKPT; /* 
335d0 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f  SQLITE_BUSY? pro
335e0 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c  xyTakeConch call
335f0 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 64 75  ed.           du
33600 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  ring locking */.
33610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33620 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
33630 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43  SQLITE_OK && !pC
33640 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  tx->lockProxy ){
33650 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
33660 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61  ath = tempLockPa
33670 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74  th ? tempLockPat
33680 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h : pCtx->lockPr
33690 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
336a0 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
336b0 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20  eUnixFile(path, 
336c0 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  &pCtx->lockProxy
336d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
336e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
336f0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
33700 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63  MEM && tryOldLoc
33710 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
33720 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27     /* we couldn'
33730 74 20 63 72 65 61 74 65 20 74 68 65 20 70 72 6f  t create the pro
33740 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74  xy lock file wit
33750 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66  h the old lock f
33760 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20 20  ile path.       
33770 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67      ** so try ag
33780 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d  ain via auto-nam
33790 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20 20  ing .           
337a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
337b0 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20  ceNewLockPath = 
337c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79  1;.          try
337d0 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
337e0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
337f0 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20  nue; /* go back 
33800 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69  to the do {} whi
33810 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20  le start point, 
33820 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  try again */.   
33830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33840 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33850 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33860 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
33870 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68  e a copy of path
33880 20 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64   if we extracted
33890 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
338a0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
338b0 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68  conch file or th
338c0 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63  e path was alloc
338d0 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63  ated on the stac
338e0 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k.         */.  
338f0 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f        if( tempLo
33900 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
33910 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
33920 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
33930 33 44 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d  3DbStrDup(0, tem
33940 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20  pLockPath);.    
33950 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
33960 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
33970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
33980 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
33990 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
339a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
339b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
339c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
339d0 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
339e0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  d = 1;.        .
339f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
33a00 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  ->lockProxy->pMe
33a10 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65  thod == &afpIoMe
33a20 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
33a30 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
33a40 74 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20  text *afpCtx;.  
33a50 20 20 20 20 20 20 20 20 61 66 70 43 74 78 20 3d          afpCtx =
33a60 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
33a70 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b  ext *)pCtx->lock
33a80 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  Proxy->lockingCo
33a90 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  ntext;.         
33aa0 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20   afpCtx->dbPath 
33ab0 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
33ac0 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
33ad0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
33ae0 20 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c          conchFil
33af0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
33b00 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
33b10 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
33b20 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
33b30 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
33b40 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73  TAKECONCH  %d %s
33b50 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
33b60 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
33b70 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f    rc==SQLITE_OK?
33b80 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b  "ok":"failed"));
33b90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
33ba0 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31  ;.    } while (1
33bb0 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65  ); /* in case we
33bc0 20 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20 74   need to retry t
33bd0 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66  he :auto: lock f
33be0 69 6c 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20  ile - .         
33bf0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68          ** we sh
33c00 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68  ould never get h
33c10 65 72 65 20 65 78 63 65 70 74 20 76 69 61 20 74  ere except via t
33c20 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61  he 'continue' ca
33c30 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ll. */.  }.}../*
33c40 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c  .** If pFile hol
33c50 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63  ds a lock on a c
33c60 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20  onch file, then 
33c70 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63  release that loc
33c80 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
33c90 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e   proxyReleaseCon
33ca0 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
33cb0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  le){.  int rc = 
33cc0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
33cd0 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
33ce0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
33cf0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
33d00 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a  ntext *pCtx;  /*
33d10 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   The locking con
33d20 74 65 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f  text for the pro
33d30 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69  xy lock */.  uni
33d40 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
33d50 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ;        /* Name
33d60 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
33d70 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20  le */..  pCtx = 
33d80 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
33d90 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
33da0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
33db0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
33dc0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f  ->conchFile;.  O
33dd0 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45  STRACE(("RELEASE
33de0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
33df0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
33e00 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
33e10 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
33e20 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
33e30 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
33e40 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20  : ":auto:"), .  
33e50 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
33e60 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d  )));.  if( pCtx-
33e70 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
33e80 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
33e90 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
33ea0 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
33eb0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e  le*)conchFile, N
33ec0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70  O_LOCK);.  }.  p
33ed0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
33ee0 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   0;.  OSTRACE(("
33ef0 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64  RELEASECONCH  %d
33f00 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c   %s\n", conchFil
33f10 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
33f20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
33f30 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
33f40 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ")));.  return r
33f50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
33f60 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
33f70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63  database file, c
33f80 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20  ompute the name 
33f90 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c  of its conch fil
33fa0 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  e..** Store the 
33fb0 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69  conch filename i
33fc0 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
33fd0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
33fe0 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65  alloc()..** Make
33ff0 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69   *pConchPath poi
34000 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61  nt to the new na
34010 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  me.  Return SQLI
34020 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
34030 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
34040 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f  MEM if unable to
34050 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a   obtain memory..
34060 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
34070 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
34080 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
34090 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  t the allocated 
340a0 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20  memory.** space 
340b0 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  is eventually fr
340c0 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e  eed..**.** *pCon
340d0 63 68 50 61 74 68 20 69 73 20 73 65 74 20 74 6f  chPath is set to
340e0 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72   NULL if a memor
340f0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
34100 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
34110 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
34120 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d  eateConchPathnam
34130 65 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  e(char *dbPath, 
34140 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74  char **pConchPat
34150 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  h){.  int i;    
34160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34170 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
34180 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e  ter */.  int len
34190 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
341a0 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74  bPath); /* Lengt
341b0 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  h of database fi
341c0 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20  lename - dbPath 
341d0 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
341e0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
341f0 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20     /* buffer in 
34200 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75  which to constru
34210 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f  ct conch name */
34220 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
34230 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f  space for the co
34240 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  nch filename and
34250 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
34260 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65  name to.  ** the
34270 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69   name of the ori
34280 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
34290 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f  ile. */  .  *pCo
342a0 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50  nchPath = conchP
342b0 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ath = (char *)sq
342c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e  lite3_malloc(len
342d0 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e   + 8);.  if( con
342e0 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20  chPath==0 ){.   
342f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
34300 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  OMEM;.  }.  memc
34310 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62  py(conchPath, db
34320 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  Path, len+1);.  
34330 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74  .  /* now insert
34340 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68   a "." before th
34350 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74  e last / charact
34360 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28  er */.  for( i=(
34370 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d  len-1); i>=0; i-
34380 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e  - ){.    if( con
34390 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29  chPath[i]=='/' )
343a0 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
343b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
343c0 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b    }.  conchPath[
343d0 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20  i]='.';.  while 
343e0 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63  ( i<len ){.    c
343f0 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62  onchPath[i+1]=db
34400 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b  Path[i];.    i++
34410 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65  ;.  }..  /* appe
34420 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20  nd the "-conch" 
34430 73 75 66 66 69 78 20 74 6f 20 74 68 65 20 66 69  suffix to the fi
34440 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  le */.  memcpy(&
34450 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20  conchPath[i+1], 
34460 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20  "-conch", 7);.  
34470 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72  assert( (int)str
34480 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d  len(conchPath) =
34490 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65  = len+7 );..  re
344a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
344b0 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66  }.../* Takes a f
344c0 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ully configured 
344d0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74  proxy locking-st
344e0 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e  yle unix file an
344f0 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68  d switches.** th
34500 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
34510 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69  e path .*/.stati
34520 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b  c int switchLock
34530 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69  ProxyPath(unixFi
34540 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74  le *pFile, const
34550 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20   char *path) {. 
34560 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
34570 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
34580 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
34590 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
345a0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72  gContext;.  char
345b0 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78   *oldPath = pCtx
345c0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
345d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
345e0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46  TE_OK;..  if( pF
345f0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
34600 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
34610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
34620 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e  Y;.  }  ..  /* n
34630 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20  othing to do if 
34640 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c  the path is NULL
34650 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63  , :auto: or matc
34660 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67  hes the existing
34670 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21   path */.  if( !
34680 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
34690 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
346a0 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
346b0 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68   ||.    (oldPath
346c0 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64   && !strncmp(old
346d0 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50  Path, path, MAXP
346e0 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20  ATHLEN)) ){.    
346f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34700 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
34710 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
34720 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
34730 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e  roxy;.    pCtx->
34740 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a  lockProxy=NULL;.
34750 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
34760 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eld = 0;.    if(
34770 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c   lockProxy!=NULL
34780 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63   ){.      rc=loc
34790 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
347a0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
347b0 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78  _file *)lockProx
347c0 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
347d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
347e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
347f0 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  (lockProxy);.   
34800 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
34810 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20  ree(oldPath);.  
34820 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
34830 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
34840 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68 29  bStrDup(0, path)
34850 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72  ;.  }.  .  retur
34860 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  n rc;.}../*.** p
34870 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74  File is a file t
34880 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65  hat has been ope
34890 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 78  ned by a prior x
348a0 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61  Open call.  dbPa
348b0 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e  th.** is a strin
348c0 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73  g buffer at leas
348d0 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63  t MAXPATHLEN+1 c
348e0 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a  haracters in siz
348f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
34900 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66  utine find the f
34910 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74  ilename associat
34920 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e  ed with pFile an
34930 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69  d writes it.** i
34940 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74  nt dbPath..*/.st
34950 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
34960 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
34970 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
34980 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68  le, char *dbPath
34990 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
349a0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20  _APPLE__).  if( 
349b0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
349c0 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
349d0 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74  ){.    /* afp st
349e0 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66 65  yle keeps a refe
349f0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20  rence to the db 
34a00 70 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65  path in the file
34a10 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20  Path field .    
34a20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ** of the struct
34a30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34a40 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61  (int)strlen((cha
34a50 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
34a60 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
34a70 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
34a80 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61  lcpy(dbPath, ((a
34a90 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
34aa0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
34ab0 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74  gContext)->dbPat
34ac0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
34ad0 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a    } else.#endif.
34ae0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
34af0 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  thod == &dotlock
34b00 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
34b10 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79   /* dot lock sty
34b20 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b  le uses the lock
34b30 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73  ing context to s
34b40 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63  tore the dot loc
34b50 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61  k.    ** file pa
34b60 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65  th */.    int le
34b70 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
34b80 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
34b90 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c  gContext) - strl
34ba0 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  en(DOTLOCK_SUFFI
34bb0 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64  X);.    memcpy(d
34bc0 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70  bPath, (char *)p
34bd0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
34be0 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a  text, len + 1);.
34bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
34c00 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73  all other styles
34c10 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67   use the locking
34c20 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72   context to stor
34c30 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 70 61  e the db file pa
34c40 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  th */.    assert
34c50 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  ( strlen((char*)
34c60 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34c70 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c  ntext)<=MAXPATHL
34c80 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70  EN );.    strlcp
34c90 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
34ca0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
34cb0 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48  Context, MAXPATH
34cc0 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LEN);.  }.  retu
34cd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
34ce0 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  ./*.** Takes an 
34cf0 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69  already filled i
34d00 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  n unix file and 
34d10 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c  alters it so all
34d20 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a   file locking .*
34d30 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72  * will be perfor
34d40 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  med on the local
34d50 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
34d60 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
34d70 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70   fields.** are p
34d80 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20  reserved in the 
34d90 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
34da0 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
34db0 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
34dc0 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74   .** the unix st
34dd0 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79  ructure properly
34de0 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63   cleaned up at c
34df0 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d  lose time:.**  -
34e00 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  >lockingContext.
34e10 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f  **  ->pMethod.*/
34e20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
34e30 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
34e40 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
34e50 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
34e60 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c  path) {.  proxyL
34e70 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
34e80 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61  Ctx;.  char dbPa
34e90 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d  th[MAXPATHLEN+1]
34ea0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
34eb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
34ec0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
34ed0 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
34ee0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34ef0 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46  _OK;.  .  if( pF
34f00 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
34f10 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
34f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
34f30 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65  Y;.  }.  proxyGe
34f40 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
34f50 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68  le(pFile, dbPath
34f60 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  );.  if( !path |
34f70 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
34f80 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
34f90 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20   ":auto:") ){.  
34fa0 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b    lockPath=NULL;
34fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f  .  }else{.    lo
34fc0 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70  ckPath=(char *)p
34fd0 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53  ath;.  }.  .  OS
34fe0 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
34ff0 58 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  XY  %d for %s pi
35000 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
35010 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c  h,.           (l
35020 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61  ockPath ? lockPa
35030 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
35040 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70  getpid()));..  p
35050 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
35060 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
35070 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74  tx) );.  if( pCt
35080 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
35090 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
350a0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43  .  }.  memset(pC
350b0 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  tx, 0, sizeof(*p
350c0 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70  Ctx));..  rc = p
350d0 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50  roxyCreateConchP
350e0 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20  athname(dbPath, 
350f0 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  &pCtx->conchFile
35100 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d  Path);.  if( rc=
35110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35120 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61    rc = proxyCrea
35130 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d  teUnixFile(pCtx-
35140 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20  >conchFilePath, 
35150 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  &pCtx->conchFile
35160 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
35170 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
35180 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70  N && ((pFile->op
35190 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20  enFlags&O_RDWR) 
351a0 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f  == 0) ){.      /
351b0 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f 70 65  * if (a) the ope
351c0 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20  n flags are not 
351d0 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65 20  O_RDWR, (b) the 
351e0 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72  conch isn't ther
351f0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  e, and.      ** 
35200 28 63 29 20 74 68 65 20 66 69 6c 65 20 73 79 73  (c) the file sys
35210 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  tem is read-only
35220 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f  , then enable no
35230 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e  -locking access.
35240 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73  .      ** Ugh, s
35250 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30  ince O_RDONLY==0
35260 78 30 30 30 30 20 77 65 20 74 65 73 74 20 66 6f  x0000 we test fo
35270 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20  r !O_RDWR since 
35280 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73  unixOpen asserts
35290 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  .      ** that o
352a0 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61  penFlags will ha
352b0 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f  ve only one of O
352c0 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57  _RDONLY or O_RDW
352d0 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  R..      */.    
352e0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
352f0 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  fsInfo;.      st
35300 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49  ruct stat conchI
35310 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67  nfo;.      int g
35320 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a  oLockless = 0;..
35330 20 20 20 20 20 20 69 66 28 20 6f 73 53 74 61 74        if( osStat
35340 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
35350 50 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f  Path, &conchInfo
35360 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20  ) == -1 ) {.    
35370 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
35380 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rno;.        if(
35390 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26   (err==ENOENT) &
353a0 26 20 28 73 74 61 74 66 73 28 64 62 50 61 74 68  & (statfs(dbPath
353b0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
353c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
353d0 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49  oLockless = (fsI
353e0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
353f0 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52  RDONLY) == MNT_R
35400 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d  DONLY;.        }
35410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35420 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b  f( goLockless ){
35430 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63  .        pCtx->c
35440 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f  onchHeld = -1; /
35450 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20  * read only FS/ 
35460 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
35470 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35480 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
35490 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63  }.  }  .  if( rc
354a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c  ==SQLITE_OK && l
354b0 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70  ockPath ){.    p
354c0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
354d0 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
354e0 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68  rDup(0, lockPath
354f0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
35500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35510 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
35520 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
35530 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  p(0, dbPath);.  
35540 20 20 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61    if( pCtx->dbPa
35550 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  th==NULL ){.    
35560 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
35570 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
35580 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35590 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c  OK ){.    /* all
355a0 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63   memory is alloc
355b0 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65  ated, proxys are
355c0 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 73 73   created and ass
355d0 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73  igned, .    ** s
355e0 77 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e  witch the lockin
355f0 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d  g context and pM
35600 65 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72  ethod then retur
35610 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  n..    */.    pC
35620 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
35630 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c  ntext = pFile->l
35640 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
35650 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
35660 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b  gContext = pCtx;
35670 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d  .    pCtx->pOldM
35680 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70  ethod = pFile->p
35690 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c  Method;.    pFil
356a0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72  e->pMethod = &pr
356b0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  oxyIoMethods;.  
356c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
356d0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29  Ctx->conchFile )
356e0 7b 20 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63  { .      pCtx->c
356f0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
35700 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
35710 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e  e3_file *)pCtx->
35720 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
35730 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
35740 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b  Ctx->conchFile);
35750 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
35760 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78  e3DbFree(0, pCtx
35770 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29  ->lockProxyPath)
35780 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
35790 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
357a0 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71  lePath); .    sq
357b0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29  lite3_free(pCtx)
357c0 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
357d0 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64  ("TRANSPROXY  %d
357e0 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
357f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  ,.           (rc
35800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
35810 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29  k" : "failed")))
35820 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
35830 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
35840 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71  utine handles sq
35850 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
35860 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  ol() calls that 
35870 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20  are specific.** 
35880 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  to proxy locking
35890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
358a0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
358b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
358c0 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
358d0 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68  *pArg){.  switch
358e0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
358f0 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
35900 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
35910 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
35920 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
35930 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  id;.      if( pF
35940 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
35950 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20  &proxyIoMethods 
35960 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
35970 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
35980 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
35990 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
359a0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
359b0 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78  xt;.        prox
359c0 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
359d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
359e0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
359f0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
35a00 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
35a10 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  pArg = pCtx->loc
35a20 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
35a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35a40 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61       *(const cha
35a50 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75  r **)pArg = ":au
35a60 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b  to: (not held)";
35a70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35a80 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
35a90 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
35aa0 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20  *)pArg = NULL;. 
35ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
35ac0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
35ad0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
35ae0 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
35af0 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
35b00 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
35b10 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
35b20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
35b30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
35b40 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c   int isProxyStyl
35b50 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74  e = (pFile->pMet
35b60 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
35b70 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69  ethods);.      i
35b80 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c  f( pArg==NULL ||
35b90 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
35ba0 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
35bb0 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
35bc0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
35bd0 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78  /* turn off prox
35be0 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20  y locking - not 
35bf0 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20  supported */.   
35c00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35c10 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54  TE_ERROR /*SQLIT
35c20 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49  E_PROTOCOL? SQLI
35c30 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20  TE_MISUSE?*/;.  
35c40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35c50 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
35c60 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
35c70 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d   - already off -
35c80 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20   NOOP */.       
35c90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
35ca0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
35cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35cc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72    const char *pr
35cd0 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74  oxyPath = (const
35ce0 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20   char *)pArg;.  
35cf0 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78        if( isProx
35d00 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20  yStyle ){.      
35d10 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
35d20 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
35d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 72  .            (pr
35d40 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
35d50 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
35d60 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
35d70 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
35d80 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20  pArg, ":auto:") 
35d90 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
35da0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
35db0 61 74 68 20 26 26 0a 20 20 20 20 20 20 20 20 20  ath &&.         
35dc0 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70        !strncmp(p
35dd0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
35de0 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d  th, proxyPath, M
35df0 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20  AXPATHLEN)).    
35e00 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
35e10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35e20 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
35e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
35e40 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63    rc = switchLoc
35e50 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65  kProxyPath(pFile
35e60 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
35e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35e90 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72     /* turn on pr
35ea0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
35eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
35ec0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
35ed0 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c  mUnixFile(pFile,
35ee0 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
35ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
35f00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
35f10 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
35f20 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
35f30 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  t( 0 );  /* The 
35f40 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61  call assures tha
35f50 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63  t only valid opc
35f60 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f  odes are sent */
35f70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
35f80 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65  OTREACHED*/.  re
35f90 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
35fa0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68  R;.}../*.** With
35fb0 69 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  in this division
35fc0 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c   (the proxying l
35fd0 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
35fe0 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65  ation) the proce
35ff0 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74  dures.** above t
36000 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c  his point are al
36010 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68  l utilities.  Th
36020 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d  e lock-related m
36030 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a  ethods of the.**
36040 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73   proxy-locking s
36050 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
36060 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a   object follow..
36070 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  */.../*.** This 
36080 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
36090 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
360a0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
360b0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
360c0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
360d0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
360e0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
360f0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
36100 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
36110 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
36120 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
36130 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
36140 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
36150 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
36160 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
36170 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
36180 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
36190 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
361a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
361b0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
361c0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
361d0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
361e0 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  Out) {.  unixFil
361f0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
36200 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
36210 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
36220 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
36230 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36240 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
36250 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36260 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
36270 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
36280 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
36290 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
362a0 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
362b0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
362c0 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
362d0 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74  Proxy;.      ret
362e0 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  urn proxy->pMeth
362f0 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76  od->xCheckReserv
36300 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  edLock((sqlite3_
36310 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65  file*)proxy, pRe
36320 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sOut);.    }else
36330 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c  { /* conchHeld <
36340 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a   0 is lockless *
36350 2f 0a 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d  /.      pResOut=
36360 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
36370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36380 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
36390 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
363a0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
363b0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
363c0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
363d0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
363e0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
363f0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
36400 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
36410 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
36420 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
36430 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
36440 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
36450 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
36460 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
36470 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
36480 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
36490 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
364a0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
364b0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
364c0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
364d0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
364e0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
364f0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
36500 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
36510 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
36520 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
36530 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
36540 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
36550 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
36560 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
36570 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
36580 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
36590 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
365a0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
365b0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
365c0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
365d0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
365e0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
365f0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
36600 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
36610 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
36620 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
36630 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
36640 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
36650 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
36660 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
36670 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
36680 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
36690 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
366a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
366b0 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  yLock(sqlite3_fi
366c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
366d0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
366e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
366f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
36700 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
36710 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
36720 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36730 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
36740 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
36750 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
36760 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
36770 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
36780 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
36790 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
367a0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
367b0 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
367c0 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
367d0 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  c = proxy->pMeth
367e0 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
367f0 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20  e3_file*)proxy, 
36800 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  eFileLock);.    
36810 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
36820 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c  ck = proxy->eFil
36830 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  eLock;.    }else
36840 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68  {.      /* conch
36850 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b  Held < 0 is lock
36860 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  less */.    }.  
36870 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
36880 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  .../*.** Lower t
36890 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
368a0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
368b0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
368c0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
368d0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
368e0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
368f0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
36900 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
36910 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
36920 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
36930 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
36940 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
36950 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
36960 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
36970 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
36980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
36990 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
369a0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
369b0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
369c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
369d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
369e0 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
369f0 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
36a00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36a10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
36a20 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
36a30 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
36a40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
36a50 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
36a60 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  text;.    if( pC
36a70 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
36a80 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  ){.      unixFil
36a90 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d  e *proxy = pCtx-
36aa0 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
36ab0 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d    rc = proxy->pM
36ac0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
36ad0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
36ae0 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b  oxy, eFileLock);
36af0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
36b00 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d  ileLock = proxy-
36b10 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
36b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
36b30 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
36b40 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
36b50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
36b60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
36b70 73 65 20 61 20 66 69 6c 65 20 74 68 61 74 20 75  se a file that u
36b80 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e  ses proxy locks.
36b90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
36ba0 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
36bb0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
36bc0 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
36bd0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
36be0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
36bf0 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
36c00 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
36c10 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36c20 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
36c30 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
36c40 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
36c50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
36c60 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78  kProxy;.    unix
36c70 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
36c80 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
36c90 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e;.    int rc = 
36ca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a  SQLITE_OK;.    .
36cb0 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78      if( lockProx
36cc0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
36cd0 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
36ce0 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
36cf0 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
36d00 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  roxy, NO_LOCK);.
36d10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
36d20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36d30 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e  rc = lockProxy->
36d40 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
36d50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
36d60 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
36d70 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
36d80 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
36d90 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78  e3_free(lockProx
36da0 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  y);.      pCtx->
36db0 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20  lockProxy = 0;. 
36dc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e     }.    if( con
36dd0 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  chFile ){.      
36de0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
36df0 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  eld ){.        r
36e00 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65  c = proxyRelease
36e10 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
36e20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
36e30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36e40 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e  }.      rc = con
36e50 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
36e60 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
36e70 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
36e80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
36e90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
36ea0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
36eb0 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
36ec0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
36ed0 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63  ree(0, pCtx->loc
36ee0 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20  kProxyPath);.   
36ef0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
36f00 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
36f10 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  h);.    sqlite3D
36f20 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64  bFree(0, pCtx->d
36f30 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72  bPath);.    /* r
36f40 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69  estore the origi
36f50 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  nal locking cont
36f60 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20  ext and pMethod 
36f70 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f  then close it */
36f80 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
36f90 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
36fa0 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  x->oldLockingCon
36fb0 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d  text;.    pFile-
36fc0 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d  >pMethod = pCtx-
36fd0 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20  >pOldMethod;.   
36fe0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
36ff0 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tx);.    return 
37000 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
37010 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a  xClose(id);.  }.
37020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37030 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20  OK;.}....#endif 
37040 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
37050 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
37060 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
37070 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
37080 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
37090 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65  style is intende
370a0 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 41  d for use with A
370b0 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a  FP filesystems..
370c0 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50  ** And since AFP
370d0 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
370e0 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68  ed on MacOSX, th
370f0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
37100 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72  is also.** restr
37110 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e  icted to MacOSX.
37120 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .** .**.********
37130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
37140 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
37150 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
37160 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
37170 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
37180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371c0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ******/../*.** I
371d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
371e0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
371f0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
37200 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67  This routine reg
37210 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69  isters all VFS i
37220 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
37230 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65  or unix-like ope
37240 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d  rating.** system
37250 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
37260 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  , and the sqlite
37270 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69  3_os_end() routi
37280 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c  ne that follows,
37290 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68  .** should be th
372a0 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20  e only routines 
372b0 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68 61  in this file tha
372c0 74 20 61 72 65 20 76 69 73 69 62 6c 65 20 66 72  t are visible fr
372d0 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65  om other.** file
372e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
372f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
37300 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69  once during SQLi
37310 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  te initializatio
37320 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69  n and by a.** si
37330 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68  ngle thread.  Th
37340 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
37350 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75  ion and mutex su
37360 62 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f  bsystems have no
37370 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79  t.** necessarily
37380 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
37390 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  d when this rout
373a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61  ine is called, a
373b0 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68  nd so they.** sh
373c0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64  ould not be used
373d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
373e0 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20  _os_init(void){ 
373f0 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20  .  /* .  ** The 
37400 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20  following macro 
37410 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69  defines an initi
37420 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71  alizer for an sq
37430 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
37440 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20  ..  ** The name 
37450 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e 41  of the VFS is NA
37460 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  ME.  The pAppDat
37470 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  a is a pointer t
37480 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  o a pointer.  **
37490 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22   to the "finder"
374a0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70   function.  (pAp
374b0 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74  pData is a point
374c0 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  er to a pointer 
374d0 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c  because.  ** sil
374e0 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f  ly C90 rules pro
374f0 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72  hibit a void* fr
37500 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f  om being cast to
37510 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
37520 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20  ter.  ** and so 
37530 77 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68  we have to go th
37540 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d  rough the interm
37550 65 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74  ediate pointer t
37560 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
37570 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69  .  ** when compi
37580 6c 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e  ling with -pedan
37590 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43  tic-errors on GC
375a0 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  C.).  **.  ** Th
375b0 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74  e FINDER paramet
375c0 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  er to this macro
375d0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
375e0 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  the pointer to t
375f0 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66  he.  ** finder-f
37600 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69  unction.  The fi
37610 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65  nder-function re
37620 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
37630 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  to the.  ** sqli
37640 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  te_io_methods ob
37650 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
37660 65 6e 74 73 20 74 68 65 20 64 65 73 69 72 65 64  ents the desired
37670 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65   locking.  ** be
37680 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68  haviors.  See th
37690 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65  e division above
376a0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
376b0 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a  he IOMETHODS.  *
376c0 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69  * macro for addi
376d0 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
376e0 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   on finder-funct
376f0 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ions..  **.  ** 
37700 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d  Most finders sim
37710 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ply return a poi
37720 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
37730 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
37740 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20  ds.  ** object. 
37750 20 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f   But the "autolo
37760 63 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69  ckIoFinder" avai
37770 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
37780 64 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20  does a little.  
37790 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61  ** more than tha
377a0 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74  t; it looks at t
377b0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79  he filesystem ty
377c0 70 65 20 74 68 61 74 20 68 6f 73 74 73 20 74 68  pe that hosts th
377d0 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
377e0 20 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20   file and tries 
377f0 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63  to choose an loc
37800 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72  king method appr
37810 6f 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a  opriate for.  **
37820 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d   that filesystem
37830 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64   time..  */.  #d
37840 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46  efine UNIXVFS(VF
37850 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b  SNAME, FINDER) {
37860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37870 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 33 2c          \.    3,
37880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37890 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
378a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
378b0 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65        \.    size
378c0 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20  of(unixFile),   
378d0 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
378e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378f0 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41      \.    MAX_PA
37900 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20  THNAME,         
37910 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
37920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37930 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20    \.    0,      
37940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37950 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20   pNext */       
37960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37970 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20  \.    VFSNAME,  
37980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
37990 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Name */         
379a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
379b0 20 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44      (void*)&FIND
379c0 45 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70  ER,       /* pAp
379d0 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20  pData */        
379e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
379f0 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20    unixOpen,     
37a00 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
37a10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37a20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37a30 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20  unixDelete,     
37a40 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
37a50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37a60 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37a70 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  ixAccess,       
37a80 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
37a90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37aa0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37ab0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
37ac0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
37ad0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
37ae0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
37af0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
37b00 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20  /* xDlOpen */   
37b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72    \.    unixDlEr
37b30 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
37b40 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20   xDlError */    
37b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b60 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c  \.    unixDlSym,
37b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
37b80 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20  DlSym */        
37b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37ba0 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c      unixDlClose,
37bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
37bc0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
37bd0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37be0 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73    unixRandomness
37bf0 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
37c00 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20  omness */       
37c10 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37c20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20  unixSleep,      
37c30 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
37c40 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
37c50 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37c60 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  ixCurrentTime,  
37c70 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
37c80 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ime */          
37c90 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37ca0 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
37cb0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
37cc0 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  or */           
37cd0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
37ce0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
37cf0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
37d00 6e 74 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20  nt64 */         
37d10 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 65 74 53    \.    unixSetS
37d20 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
37d30 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
37d40 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
37d50 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 53 79 73  \.    unixGetSys
37d60 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
37d70 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
37d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37d90 20 20 20 20 75 6e 69 78 4e 65 78 74 53 79 73 74      unixNextSyst
37da0 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
37db0 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20  xtSystemCall */ 
37dc0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37dd0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  }..  /*.  ** All
37de0 20 64 65 66 61 75 6c 74 20 56 46 53 65 73 20 66   default VFSes f
37df0 6f 72 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74  or unix are cont
37e00 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c  ained in the fol
37e10 6c 6f 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20  lowing array..  
37e20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
37e30 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  t the sqlite3_vf
37e40 73 2e 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  s.pNext field of
37e50 20 74 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20   the VFS object 
37e60 69 73 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a  is modified.  **
37e70 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 63   by the SQLite c
37e80 6f 72 65 20 77 68 65 6e 20 74 68 65 20 56 46 53  ore when the VFS
37e90 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 20   is registered. 
37ea0 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   So the followin
37eb0 67 0a 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e  g.  ** array can
37ec0 6e 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20  not be const..  
37ed0 2a 2f 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  */.  static sqli
37ee0 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d  te3_vfs aVfs[] =
37ef0 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   {.#if SQLITE_EN
37f00 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
37f10 4c 45 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b  LE && (OS_VXWORK
37f20 53 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  S || defined(__A
37f30 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49  PPLE__)).    UNI
37f40 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20  XVFS("unix",    
37f50 20 20 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f        autolockIo
37f60 46 69 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a  Finder ),.#else.
37f70 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
37f80 78 22 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73  x",          pos
37f90 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ixIoFinder ),.#e
37fa0 6e 64 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53  ndif.    UNIXVFS
37fb0 28 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20  ("unix-none",   
37fc0 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
37fd0 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28   ),.    UNIXVFS(
37fe0 22 75 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20  "unix-dotfile", 
37ff0 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72   dotlockIoFinder
38000 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28   ),.    UNIXVFS(
38010 22 75 6e 69 78 2d 65 78 63 6c 22 2c 20 20 20 20  "unix-excl",    
38020 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29   posixIoFinder )
38030 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ,.#if OS_VXWORKS
38040 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
38050 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65  ix-namedsem", se
38060 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e  mIoFinder ),.#en
38070 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
38080 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
38090 59 4c 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28  YLE.    UNIXVFS(
380a0 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20  "unix-posix",   
380b0 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29   posixIoFinder )
380c0 2c 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  ,.#if !OS_VXWORK
380d0 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  S.    UNIXVFS("u
380e0 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66  nix-flock",    f
380f0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
38100 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69  #endif.#endif.#i
38110 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
38120 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
38130 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
38140 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28  __).    UNIXVFS(
38150 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20  "unix-afp",     
38160 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a   afpIoFinder ),.
38170 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
38180 78 2d 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73  x-nfs",      nfs
38190 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20  IoFinder ),.    
381a0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72  UNIXVFS("unix-pr
381b0 6f 78 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f  oxy",    proxyIo
381c0 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
381d0 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
381e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
381f0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
38200 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65   */..  /* Double
38210 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20  -check that the 
38220 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79  aSyscall[] array
38230 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72   has been constr
38240 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65  ucted.  ** corre
38250 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65  ctly.  See ticke
38260 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65  t [bb3a86e890c8e
38270 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72  96ab] */.  asser
38280 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79  t( ArraySize(aSy
38290 73 63 61 6c 6c 29 3d 3d 31 38 20 29 3b 0a 0a 20  scall)==18 );.. 
382a0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
382b0 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20 69   VFSes defined i
382c0 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72  n the aVfs[] arr
382d0 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ay */.  for(i=0;
382e0 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29   i<(sizeof(aVfs)
382f0 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f  /sizeof(sqlite3_
38300 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  vfs)); i++){.   
38310 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
38320 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20  ister(&aVfs[i], 
38330 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i==0);.  }.  ret
38340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
38350 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
38360 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  n the operating 
38370 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
38380 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65  ..**.** Some ope
38390 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d  rating systems m
383a0 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20  ight need to do 
383b0 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20  some cleanup in 
383c0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  this routine,.**
383d0 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61   to release dyna
383e0 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
383f0 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20  d objects.  But 
38400 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20  not on unix..** 
38410 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
38420 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78  a no-op for unix
38430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
38440 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
38450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
38460 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20  OK; .}. .#endif 
38470 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  /* SQLITE_OS_UNI
38480 58 20 2a 2f 0a                                   X */.