/ Hex Artifact Content
Login

Artifact 1be46a35bad4bec5171e4de88aaff817260eb378:


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 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
12c0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
12d0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
12e0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
12f0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
1300: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
1310: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
1320: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
1330: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
1340: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
1350: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
1360: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
1370: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
1380: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
1390: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
13a0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
13b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
13c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
13d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
13e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
13f0: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
1400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1410: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
1420: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1430: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1440: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1450: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
1460: 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  *. ** Default pe
1470: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1480: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1490: 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64  xy dir. */.#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
14c0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1500: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1510: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1520: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1530: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1540: 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  2../*.** Only se
1550: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1560: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1570: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1580: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1590: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
15a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
15b0: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
15c0: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
15d0: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
15e0: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
15f0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1600: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1610: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1620: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1640: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1650: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1660: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1670: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1690: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
16a0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
16b0: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
16c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
16d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
16e0: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
16f0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1700: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1710: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1720: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1730: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1740: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1750: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1760: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1770: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1780: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1790: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
17a0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
17b0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
17c0: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
17d0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
17e0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
17f0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1800: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1810: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1820: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1830: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1840: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1850: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1860: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1870: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
18a0: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
18b0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
18c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
18d0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
18e0: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
18f0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1900: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1910: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1920: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1930: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1940: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1950: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1960: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1970: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1980: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1990: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
19a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
19b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
19c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
19d0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
19e0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
19f0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1a00: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1a10: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1a20: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69  t entry */.  uni
1a30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1a40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1a50: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
1a60: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
1a70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aa0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1ab0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
1ac0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1af0: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
1b00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b10: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b30: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b40: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b50: 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f  .  int lastErrno
1b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1b80: 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61  ix errno from la
1b90: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1ba0: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1bb0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1bc0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1bd0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1be0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1bf0: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c10: 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  * Pre-allocated 
1c20: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a  UnixUnusedFd */.
1c30: 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73 3b    int fileFlags;
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c 6c        /* Miscell
1c60: 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20  anous flags */. 
1c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c80: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c90: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ca0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cb0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ce0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1cf0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d00: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d30: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d40: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d50: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d60: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d70: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d90: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1da0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1db0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1dc0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dd0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1de0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1df0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e20: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e30: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e40: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e50: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e80: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e90: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1ea0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1eb0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1ec0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ed0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ee0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ef0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f00: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f10: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f20: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f30: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f40: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f60: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f70: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f80: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f90: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fa0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fb0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fc0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fd0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fe0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1ff0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2000: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2010: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2020: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2030: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2040: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2050: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2060: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2070: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2080: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2090: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20a0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20c0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20d0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20e0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20f0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2100: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2110: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2120: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2130: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2140: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2150: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2160: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2170: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2180: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2190: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21a0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21b0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21c0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21d0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21e0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21f0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2200: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2210: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2220: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
2230: 61 63 72 6f 73 20 64 65 66 69 6e 65 20 62 69 74  acros define bit
2240: 73 20 69 6e 20 75 6e 69 78 46 69 6c 65 2e 66 69  s in unixFile.fi
2250: 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  leFlags.*/.#defi
2260: 6e 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f  ne SQLITE_WHOLE_
2270: 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 20 30 78  FILE_LOCKING  0x
2280: 30 30 30 31 20 20 20 2f 2a 20 55 73 65 20 77 68  0001   /* Use wh
2290: 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ole-file locking
22a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
22b0: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
22c0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
22d0: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
22e0: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
22f0: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  n.h"../*.** Defi
2300: 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f  ne various macro
2310: 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69  s that are missi
2320: 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73  ng from some sys
2330: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
2340: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2350: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2360: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  E 0.#endif.#ifde
2370: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2380: 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c  _LFS.# undef O_L
2390: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
23a0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
23b0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
23c0: 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69  _NOFOLLOW.# defi
23d0: 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a  ne O_NOFOLLOW 0.
23e0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
23f0: 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65  _BINARY.# define
2400: 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64   O_BINARY 0.#end
2410: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a  if../*.** The DJ
2420: 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76  GPP compiler env
2430: 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d  ironment looks m
2440: 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c  ostly like Unix,
2450: 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73   but it.** lacks
2460: 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   the fcntl() sys
2470: 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65  tem call.  So re
2480: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74  define fcntl() t
2490: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  o be something.*
24a0: 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75  * that always su
24b0: 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65  cceeds.  This me
24c0: 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67  ans that locking
24d0: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
24e0: 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20  under.** DJGPP. 
24f0: 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d   But it is DOS -
2500: 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78   what did you ex
2510: 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20  pect?.*/.#ifdef 
2520: 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69  __DJGPP__.# defi
2530: 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20  ne fcntl(A,B,C) 
2540: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2550: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
2560: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
2570: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
2580: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
2590: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
25a0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
25b0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
25c0: 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20  EADSAFE.#define 
25d0: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
25e0: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
25f0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
2600: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2610: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
2620: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
2630: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
2640: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
2650: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
2660: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
2670: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
2680: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
2690: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
26a0: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
26b0: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
26c0: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
26d0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
26e0: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
26f0: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
2700: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
2710: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
2720: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
2730: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
2740: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
2750: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
2760: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
2770: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
2780: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
2790: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
27a0: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
27b0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
27c0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
27d0: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
27e0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
27f0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2800: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2810: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
2820: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2830: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2840: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
2850: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c  tatic void unixL
2860: 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
2870: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2880: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
2890: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
28a0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
28b0: 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  TER));.}.#ifdef 
28c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
28d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
28e0: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
28f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
2900: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
2910: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
2920: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
2930: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64  MASTER));.}.#end
2940: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
2950: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48  TE_DEBUG./*.** H
2960: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
2970: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
2980: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
2990: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
29a0: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
29b0: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
29c0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
29d0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
29e0: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
29f0: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
2a00: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2a10: 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65  azFileLock(int e
2a20: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69  FileLock){.  swi
2a30: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
2a40: 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f  {.    case NO_LO
2a50: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
2a60: 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41 52  ";.    case SHAR
2a70: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
2a80: 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61  "SHARED";.    ca
2a90: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
2aa0: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
2ab0: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45  ED";.    case PE
2ac0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
2ad0: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
2ae0: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
2af0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
2b00: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
2b10: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
2b20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
2b30: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
2b40: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
2b50: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
2b60: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
2b70: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
2b80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2b90: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
2ba0: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
2bb0: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
2bc0: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
2bd0: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
2be0: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
2bf0: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
2c00: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
2c10: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
2c20: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
2c30: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
2c40: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
2c50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c60: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
2c70: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
2c80: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
2c90: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
2ca0: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
2cb0: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
2cc0: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
2cd0: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
2ce0: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
2cf0: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
2d00: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
2d10: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
2d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 66  }else{.    s = f
2d30: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
2d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2d50: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
2d60: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
2d70: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
2d80: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
2d90: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
2da0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
2db0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
2dc0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
2dd0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
2de0: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
2df0: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
2e00: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
2e10: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
2e20: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
2e30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2e40: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
2e50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
2e60: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
2e70: 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64  ;.  s = fcntl(fd
2e80: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
2e90: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
2ea0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2eb0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
2ec0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
2ed0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
2ee0: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
2ef0: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
2f00: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
2f10: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
2f20: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
2f30: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
2f40: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
2f50: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
2f60: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
2f70: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
2f80: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
2f90: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
2fa0: 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c  p;.    fcntl(fd,
2fb0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
2fc0: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
2fd0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
2fe0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
2ff0: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
3000: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
3010: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
3020: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
3030: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
3040: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
3050: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
3060: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
3070: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
3080: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
3090: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
30a0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
30b0: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
30c0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
30d0: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
30e0: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
30f0: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
3100: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
3110: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
3120: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
3130: 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c  .}.#define fcntl
3140: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
3150: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
3160: 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a 2f 2a 0a  _TRACE */..../*.
3170: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3180: 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61  translates a sta
3190: 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e  ndard POSIX errn
31a0: 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65  o code into some
31b0: 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20  thing.** useful 
31c0: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f  to the clients o
31d0: 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75  f the sqlite3 fu
31e0: 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66  nctions.  Specif
31f0: 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a  ically, it is.**
3200: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61   intended to tra
3210: 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79  nslate a variety
3220: 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20   of "try again" 
3230: 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49  errors into SQLI
3240: 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61  TE_BUSY.** and a
3250: 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65   variety of "ple
3260: 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69  ase close the fi
3270: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f  le descriptor NO
3280: 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a  W" errors into .
3290: 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  ** SQLITE_IOERR.
32a0: 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75  ** .** Errors du
32b0: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
32c0: 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72  ion of locks, or
32d0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
32e0: 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a  port for locks,.
32f0: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65  ** should handle
3300: 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50   ENOLCK, ENOTSUP
3310: 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70  , EOPNOTSUPP sep
3320: 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  arately..*/.stat
3330: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72  ic int sqliteErr
3340: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
3350: 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c  (int posixError,
3360: 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72   int sqliteIOErr
3370: 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f  ) {.  switch (po
3380: 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61  sixError) {.  ca
3390: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
33a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
33b0: 20 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a   .  case EAGAIN:
33c0: 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55  .  case ETIMEDOU
33d0: 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a  T:.  case EBUSY:
33e0: 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20  .  case EINTR:. 
33f0: 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a   case ENOLCK:  .
3400: 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46      /* random NF
3410: 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75  S retry error, u
3420: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
3430: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
3440: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
3450: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
3460: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
3470: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
3480: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
3490: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a  LITE_BUSY;.    .
34a0: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
34b0: 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73      /* EACCES is
34c0: 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72   like EAGAIN dur
34d0: 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  ing locking oper
34e0: 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20  ations, but not 
34f0: 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f  any other time*/
3500: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
3510: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
3520: 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a  IOERR_LOCK) || .
3530: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3540: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
3550: 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69  LOCK) || ..(sqli
3560: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
3570: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20  E_IOERR_RDLOCK) 
3580: 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  ||..(sqliteIOErr
3590: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
35a0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
35b0: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  CK) ){.      ret
35c0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
35d0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c  .    }.    /* el
35e0: 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
35f0: 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a  */.  case EPERM:
3600: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
3610: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20  ITE_PERM;.    . 
3620: 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20   case EDEADLK:. 
3630: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3640: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
3650: 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53      .#if EOPNOTS
3660: 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63  UPP!=ENOTSUP.  c
3670: 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20  ase EOPNOTSUPP: 
3680: 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e  .    /* somethin
3690: 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20  g went terribly 
36a0: 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72  awry, unless dur
36b0: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
36c0: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
36d0: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
36e0: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
36f0: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
3700: 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66  t says */.#endif
3710: 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a  .#ifdef ENOTSUP.
3720: 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20    case ENOTSUP: 
3730: 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20  .    /* invalid 
3740: 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  fd, unless durin
3750: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
3760: 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74  pport introspect
3770: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20  ion, in which . 
3780: 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c      * it actuall
3790: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
37a0: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  says */.#endif. 
37b0: 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73   case EIO:.  cas
37c0: 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20  e EBADF:.  case 
37d0: 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45  EINVAL:.  case E
37e0: 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20  NOTCONN:.  case 
37f0: 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45  ENODEV:.  case E
3800: 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NXIO:.  case ENO
3810: 45 4e 54 3a 0a 20 20 63 61 73 65 20 45 53 54 41  ENT:.  case ESTA
3820: 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  LE:.  case ENOSY
3830: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
3840: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
3850: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
3860: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
3870: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
3880: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
3890: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
38a0: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a  rr;.  }.}..../**
38b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
3900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
3910: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
3920: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
3930: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
3940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
3950: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
3960: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
3970: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
3980: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
3990: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
39a0: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
39b0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
39c0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
39d0: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
39e0: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
39f0: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
3a00: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
3a10: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
3a20: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
3a30: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
3a40: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
3a50: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3a60: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3a70: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
3a80: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
3a90: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
3aa0: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
3ab0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
3ac0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
3ad0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
3ae0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
3af0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
3b00: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3b10: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
3b20: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
3b30: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
3b40: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
3b50: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
3b60: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
3b70: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
3b80: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
3b90: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
3ba0: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
3bb0: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
3bc0: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
3bd0: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
3be0: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
3bf0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
3c00: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
3c10: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
3c20: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
3c30: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3c40: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
3c50: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
3c60: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
3c70: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c90: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
3ca0: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
3cb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cd0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
3ce0: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
3cf0: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
3d00: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
3d10: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
3d20: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
3d30: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
3d40: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
3d50: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
3d60: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
3d70: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
3d80: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
3d90: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
3da0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
3db0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
3dc0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
3dd0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
3de0: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
3df0: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
3e00: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
3e10: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
3e20: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
3e30: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
3e40: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
3e50: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
3e60: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
3e70: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
3e80: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
3e90: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
3ea0: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
3eb0: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
3ec0: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
3ed0: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
3ee0: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
3ef0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
3f00: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
3f10: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
3f20: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3f30: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
3f40: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
3f50: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
3f60: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
3f70: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
3f80: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
3f90: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
3fa0: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
3fb0: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
3fc0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
3fd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
3fe0: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
3ff0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
4000: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
4010: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
4020: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
4030: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
4040: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
4050: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
4060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4070: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
4080: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
4090: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
40a0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
40b0: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
40c0: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
40d0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
40e0: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
40f0: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
4100: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
4110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4120: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
4130: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
4140: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
4150: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
4160: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
4170: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
4180: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
4190: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
41a0: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
41b0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
41c0: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
41d0: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
41e0: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
41f0: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
4200: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
4210: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
4220: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
4230: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
4240: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
4250: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
4260: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
4270: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
4280: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
4290: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
42a0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
42b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
42c0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
42d0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
42e0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
42f0: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
4300: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
4310: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
4320: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
4330: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
4340: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
4350: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
4360: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
4370: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
4380: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
4390: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
43a0: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
43b0: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
43c0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
43f0: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
4400: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
4410: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
4420: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
4430: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
4440: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
4450: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
4460: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
4470: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
4480: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
4490: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
44a0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
44b0: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
44c0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
44d0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
44e0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
44f0: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
4500: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
4510: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4520: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
4530: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
4540: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
4550: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
4560: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
4570: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
4580: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
4590: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
45a0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
45b0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
45c0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
45d0: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
45e0: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
45f0: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
4600: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
4610: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
4620: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
4630: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
4640: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
4650: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
4660: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
4670: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
4680: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
4690: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
46a0: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
46b0: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
46c0: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
46d0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
46e0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
46f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
4700: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
4710: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
4720: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
4730: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
4740: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
4750: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
4760: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
4770: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
4780: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
4790: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
47a0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
47b0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
47c0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
47d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
47e0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
47f0: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
4800: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
4810: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
4820: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
4830: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
4840: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
4850: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
4860: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
4870: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
4880: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
4890: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
48a0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
48b0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
48c0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
48d0: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
48e0: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
48f0: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
4900: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
4910: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
4920: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
4930: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
4940: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
4950: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
4960: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
4970: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4980: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
4990: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
49a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
49b0: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
49d0: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
49e0: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
49f0: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
4a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
4a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
4a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
4ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ac0: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
4ad0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
4ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
4b00: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
4b10: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
4b20: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
4b30: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
4b40: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
4b50: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
4b60: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
4b70: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
4b80: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
4b90: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
4ba0: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
4bb0: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
4bc0: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
4bd0: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
4be0: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
4bf0: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
4c00: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
4c10: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
4c20: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
4c30: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
4c40: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
4c50: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
4c60: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
4c70: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
4c80: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
4c90: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4ca0: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
4cb0: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
4cc0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
4cd0: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
4ce0: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
4cf0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
4d00: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
4d10: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
4d20: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
4d30: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
4d40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
4d50: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
4d60: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
4d70: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
4d80: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
4d90: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
4da0: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
4db0: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
4dc0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
4dd0: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
4de0: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
4df0: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
4e00: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
4e10: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
4e20: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
4e30: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
4e40: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
4e50: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
4e60: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
4e70: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
4e80: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
4e90: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
4ea0: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
4eb0: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
4ec0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
4ed0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
4ee0: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
4ef0: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
4f00: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
4f10: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
4f20: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
4f30: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
4f40: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
4f50: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
4f60: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
4f70: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
4f80: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
4f90: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
4fa0: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
4fb0: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
4fc0: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
4fd0: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
4fe0: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
4ff0: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
5000: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
5010: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
5020: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
5030: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
5040: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
5050: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
5060: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
5070: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
5080: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
5090: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
50a0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
50b0: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
50c0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
50d0: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
50e0: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
50f0: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
5100: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
5110: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
5120: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
5130: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
5140: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
5150: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
5160: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
5170: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
5180: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
5190: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
51a0: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
51b0: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
51c0: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
51d0: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
51e0: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
51f0: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
5200: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
5210: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
5220: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
5230: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
5240: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
5250: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
5260: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
5270: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
5280: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
5290: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
52a0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
52b0: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
52c0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
52d0: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
52e0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
52f0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
5300: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
5310: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
5320: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
5330: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
5340: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
5350: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
5360: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
5370: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
5380: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
5390: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
53a0: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
53b0: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
53c0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
53d0: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
53e0: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
53f0: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
5400: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
5410: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
5420: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
5430: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
5440: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
5450: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
5460: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
5470: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
5480: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
5490: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
54a0: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
54b0: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
54c0: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
54d0: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
54e0: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
54f0: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
5500: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
5510: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
5520: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
5530: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
5540: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
5550: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
5560: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
5570: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
5580: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
5590: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
55a0: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
55b0: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
55c0: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
55d0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
55e0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
55f0: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
5600: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
5610: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
5620: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
5630: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
5640: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
5650: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
5660: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
5670: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
5680: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
5690: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
56a0: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
56b0: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
56c0: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
56d0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
56e0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
56f0: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
5700: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
5710: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
5720: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
5730: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
5740: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
5750: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
5760: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
5770: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
5780: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
5790: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
57a0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
57b0: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
57c0: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
57d0: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
57e0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
57f0: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
5800: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
5810: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
5820: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
5830: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
5840: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
5850: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
5860: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
5870: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
5880: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
5890: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
58a0: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
58b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
58c0: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
58d0: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
58e0: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
58f0: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
5900: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
5910: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
5920: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
5930: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
5940: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
5950: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
5960: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
5970: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
5980: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
5990: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
59a0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
59b0: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
59c0: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
59d0: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
59e0: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
59f0: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
5a00: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
5a10: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
5a20: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
5a30: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
5a40: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
5a50: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
5a60: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
5a70: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
5a80: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
5a90: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
5aa0: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
5ab0: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
5ac0: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
5ad0: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
5ae0: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
5af0: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
5b00: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
5b10: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
5b20: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
5b30: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
5b40: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
5b50: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
5b60: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
5b70: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
5b80: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
5b90: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
5ba0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5bb0: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
5bc0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
5bd0: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
5be0: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
5bf0: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
5c00: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
5c10: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
5c20: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
5c30: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
5c40: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
5c50: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
5c60: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
5c70: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
5c80: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
5c90: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
5ca0: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
5cb0: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
5cc0: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
5cd0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
5ce0: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
5cf0: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
5d00: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
5d10: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
5d30: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
5d40: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
5d50: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
5d60: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5d70: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
5d80: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
5d90: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
5da0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5db0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5dc0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
5dd0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
5de0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
5df0: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
5e00: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
5e10: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
5e20: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
5e50: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
5e60: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
5e70: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
5e80: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
5e90: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
5ea0: 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74  */.#else.  ino_t
5eb0: 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20   ino;           
5ec0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20         /* Inode 
5ed0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66  number */.#endif
5ee0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
5ef0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
5f00: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
5f10: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  e is allocated f
5f20: 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20  or each open.** 
5f30: 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c  inode.  Or, on L
5f40: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65  inuxThreads, the
5f50: 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  re is one of the
5f60: 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  se structures fo
5f70: 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20  r.** each inode 
5f80: 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74  opened by each t
5f90: 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  hread..**.** A s
5fa0: 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20  ingle inode can 
5fb0: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69  have multiple fi
5fc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
5fd0: 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65  so each unixFile
5fe0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f  .** structure co
5ff0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
6000: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
6010: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61  of this object a
6020: 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63  nd this.** objec
6030: 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20  t keeps a count 
6040: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
6050: 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69   unixFile pointi
6060: 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72  ng to it..*/.str
6070: 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  uct unixInodeInf
6080: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  o {.  struct uni
6090: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
60a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
60b0: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
60c0: 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   nShared;       
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60e0: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
60f0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
6100: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 3b 20   int eFileLock; 
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6120: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
6130: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
6140: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
6150: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
6180: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
6190: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69  ructure */.  uni
61a0: 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
61b0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
61c0: 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  Shared memory as
61d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
61e0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
61f0: 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  t nLock;        
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6210: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
6220: 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  anding file lock
6230: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
6240: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
6250: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
6260: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6270: 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  s to close */.  
6280: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
6290: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
62a0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
62b0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
62c0: 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  ects */.  unixIn
62d0: 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20  odeInfo *pPrev; 
62e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
62f0: 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b  .... doubly link
6300: 65 64 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ed */.#if define
6310: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
6320: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20  LOCKING_STYLE). 
6330: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
6340: 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20  ong sharedByte; 
6350: 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75   /* for AFP simu
6360: 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63  lated shared loc
6370: 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  k */.#endif.#if 
6380: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d  OS_VXWORKS.  sem
6390: 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20  _t *pSem;       
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63b0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
63c0: 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  phore */.  char 
63d0: 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54  aSemName[MAX_PAT
63e0: 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61  HNAME+2];  /* Na
63f0: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
6400: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  hore */.#endif.}
6410: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73  ;../*.** A lists
6420: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
6430: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a  eInfo objects..*
6440: 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f  /.static unixIno
6450: 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73  deInfo *inodeLis
6460: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c  t = 0;../*.** Cl
6470: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73  ose all file des
6480: 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61  criptors accumua
6490: 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49  ted in the unixI
64a0: 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65  nodeInfo->pUnuse
64b0: 64 20 6c 69 73 74 2e 0a 2a 2a 20 49 66 20 61 6c  d list..** If al
64c0: 6c 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63  l such file desc
64d0: 72 69 70 74 6f 72 73 20 61 72 65 20 63 6c 6f 73  riptors are clos
64e0: 65 64 20 77 69 74 68 6f 75 74 20 65 72 72 6f 72  ed without error
64f0: 2c 20 74 68 65 20 6c 69 73 74 20 69 73 0a 2a 2a  , the list is.**
6500: 20 63 6c 65 61 72 65 64 20 61 6e 64 20 53 51 4c   cleared and SQL
6510: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
6520: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
6530: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
6540: 63 75 72 73 2c 20 74 68 65 6e 20 73 75 63 63 65  curs, then succe
6550: 73 73 66 75 6c 6c 79 20 63 6c 6f 73 65 64 20 66  ssfully closed f
6560: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
6570: 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20 72 65  * entries are re
6580: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 6c  moved from the l
6590: 69 73 74 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f  ist, and SQLITE_
65a0: 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65 74 75  IOERR_CLOSE retu
65b0: 72 6e 65 64 2e 20 0a 2a 2a 20 6e 6f 74 20 64 65  rned. .** not de
65c0: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
65d0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65 74  _IOERR_CLOSE ret
65e0: 75 72 6e 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69  urned..*/ .stati
65f0: 63 20 69 6e 74 20 63 6c 6f 73 65 50 65 6e 64 69  c int closePendi
6600: 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a  ngFds(unixFile *
6610: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
6620: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6630: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
6640: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
6650: 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75  Inode;.  UnixUnu
6660: 73 65 64 46 64 20 2a 70 45 72 72 6f 72 20 3d 20  sedFd *pError = 
6670: 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  0;.  UnixUnusedF
6680: 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73  d *p;.  UnixUnus
6690: 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66  edFd *pNext;.  f
66a0: 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e  or(p=pInode->pUn
66b0: 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74  used; p; p=pNext
66c0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
66d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
66e0: 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29 7b   close(p->fd) ){
66f0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
6700: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
6710: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6720: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
6730: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
6740: 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 70   pError;.      p
6750: 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20 7d  Error = p;.    }
6760: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
6770: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
6780: 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d   }.  }.  pInode-
6790: 3e 70 55 6e 75 73 65 64 20 3d 20 70 45 72 72 6f  >pUnused = pErro
67a0: 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  r;.  return rc;.
67b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
67c0: 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f   a unixInodeInfo
67d0: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
67e0: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
67f0: 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  by findInodeInfo
6800: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
6810: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
6820: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
6830: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
6840: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
6850: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
6860: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
6870: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
6880: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e  easeInodeInfo(un
6890: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
68a0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
68b0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
68c0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
68d0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
68e0: 28 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 6f  () );.  if( pIno
68f0: 64 65 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  de ){.    pInode
6900: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
6910: 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  ( pInode->nRef==
6920: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
6930: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  t( pInode->pShmN
6940: 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ode==0 );.      
6950: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
6960: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
6970: 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20  ( pInode->pPrev 
6980: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6990: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  t( pInode->pPrev
69a0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20  ->pNext==pInode 
69b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
69c0: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  e->pPrev->pNext 
69d0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
69e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
69f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 6e        assert( in
6a00: 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20  odeList==pInode 
6a10: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65  );.        inode
6a20: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  List = pInode->p
6a30: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
6a40: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
6a50: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
6a60: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
6a70: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
6a80: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
6a90: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
6aa0: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e  pPrev = pInode->
6ab0: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20  pPrev;.      }. 
6ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6ad0: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d  e(pInode);.    }
6ae0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
6af0: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
6b00: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68  iptor, locate th
6b10: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
6b20: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64  object that.** d
6b30: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
6b40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
6b50: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
6b60: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
6b70: 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
6b80: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69  lue might be uni
6b90: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
6ba0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
6bb0: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
6bc0: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
6bd0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
6be0: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
6bf0: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
6c00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
6c10: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
6c20: 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72  eturn an appropr
6c30: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
6c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
6c50: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20  indInodeInfo(.  
6c60: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6c80: 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68  * Unix file with
6c90: 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20   file desc used 
6ca0: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
6cb0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a  unixInodeInfo **
6cc0: 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f  ppInode        /
6cd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69  * Return the uni
6ce0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
6cf0: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
6d00: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6d20: 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74   System call ret
6d30: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
6d40: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6d60: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
6d70: 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f  tor for pFile */
6d80: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
6d90: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
6da0: 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20    /* Lookup key 
6db0: 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  for the unixInod
6dc0: 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63  eInfo */.  struc
6dd0: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
6de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
6df0: 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
6e00: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69  rmation */.  uni
6e10: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
6e20: 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43  de = 0;     /* C
6e30: 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f  andidate unixIno
6e40: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  deInfo object */
6e50: 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ..  assert( unix
6e60: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a  MutexHeld() );..
6e70: 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76    /* Get low-lev
6e80: 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  el information a
6e90: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68  bout the file th
6ea0: 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74  at we can used t
6eb0: 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  o.  ** create a 
6ec0: 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20  unique name for 
6ed0: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
6ee0: 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a   fd = pFile->h;.
6ef0: 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c    rc = fstat(fd,
6f00: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
6f10: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc!=0 ){.    p
6f20: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
6f30: 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20  = errno;.#ifdef 
6f40: 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66  EOVERFLOW.    if
6f50: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
6f60: 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20  no==EOVERFLOW ) 
6f70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6f80: 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LFS;.#endif.    
6f90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
6fa0: 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ERR;.  }..#ifdef
6fb0: 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20   __APPLE__.  /* 
6fc0: 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73  On OS X on an ms
6fd0: 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20  dos filesystem, 
6fe0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
6ff0: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a   is reported.  *
7000: 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f  * incorrectly fo
7010: 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65  r zero-size file
7020: 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  s.  See ticket #
7030: 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20  3260.  To work. 
7040: 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20   ** around this 
7050: 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73  problem (we cons
7060: 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e  ider it a bug in
7070: 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74   OS X, not SQLit
7080: 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79  e).  ** we alway
7090: 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  s increase the f
70a0: 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79  ile size to 1 by
70b0: 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
70c0: 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f  e byte.  ** prio
70d0: 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74  r to accessing t
70e0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
70f0: 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77    The one byte w
7100: 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61  ritten is.  ** a
7110: 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72  n ASCII 'S' char
7120: 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f  acter which also
7130: 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
7140: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
7150: 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ** in the header
7160: 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65   of every SQLite
7170: 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74   database.  In t
7180: 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72  his way, if ther
7190: 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65  e.  ** is a race
71a0: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20   condition such 
71b0: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72  that another thr
71c0: 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ead has already 
71d0: 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74  populated.  ** t
71e0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
71f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
7200: 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65  o damage is done
7210: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61  ..  */.  if( sta
7220: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20  tbuf.st_size==0 
7230: 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61  && (pFile->fsFla
7240: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c  gs & SQLITE_FSFL
7250: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30  AGS_IS_MSDOS)!=0
7260: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   ){.    rc = wri
7270: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 0a  te(fd, "S", 1);.
7280: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
7290: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
72a0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
72b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
72c0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
72d0: 7d 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74  }.    rc = fstat
72e0: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
72f0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
7300: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
7310: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
7320: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7330: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
7340: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
7350: 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20  memset(&fileId, 
7360: 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  0, sizeof(fileId
7370: 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76  ));.  fileId.dev
7380: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
7390: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
73a0: 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d  S.  fileId.pId =
73b0: 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c   pFile->pId;.#el
73c0: 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20  se.  fileId.ino 
73d0: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
73e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64  ;.#endif.  pInod
73f0: 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
7400: 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
7410: 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64  & memcmp(&fileId
7420: 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  , &pInode->fileI
7430: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
7440: 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  )) ){.    pInode
7450: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
7460: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f  ;.  }.  if( pIno
7470: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  de==0 ){.    pIn
7480: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
7490: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49  lloc( sizeof(*pI
74a0: 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28  node) );.    if(
74b0: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
74c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
74d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
74e0: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
74f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
7500: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
7510: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
7520: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
7530: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
7540: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20   pInode->nRef = 
7550: 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  1;.    pInode->p
7560: 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74  Next = inodeList
7570: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50  ;.    pInode->pP
7580: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
7590: 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f   inodeList ) ino
75a0: 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  deList->pPrev = 
75b0: 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64  pInode;.    inod
75c0: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a  eList = pInode;.
75d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
75e0: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ode->nRef++;.  }
75f0: 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49  .  *ppInode = pI
7600: 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  node;.  return S
7610: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
7620: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7630: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
7640: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
7650: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
7660: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
7670: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
7680: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
7690: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
76a0: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
76b0: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
76c0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
76d0: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
76e0: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
76f0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
7700: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
7710: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
7720: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
7730: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
7740: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
7750: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
7760: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
7770: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
7780: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
7790: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
77a0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
77b0: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
77c0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
77d0: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
77e0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
77f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7800: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
7810: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
7820: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75  rt( pFile );.  u
7830: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
7840: 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
7850: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
7860: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
7870: 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ds */..  /* Chec
7880: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
7890: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
78a0: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
78b0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
78c0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
78d0: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
78e0: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
78f0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68  1;.  }..  /* Oth
7900: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
7910: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
7920: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a   holds it..  */.
7930: 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f  #ifndef __DJGPP_
7940: 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  _.  if( !reserve
7950: 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  d ){.    struct 
7960: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
7970: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
7980: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
7990: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
79a0: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
79b0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
79c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
79d0: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69  = F_WRLCK;.    i
79e0: 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28 70  f (-1 == fcntl(p
79f0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
7a00: 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20  , &lock)) {.    
7a10: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
7a20: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
7a30: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
7a40: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
7a50: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
7a60: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
7a70: 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  K);.      pFile-
7a80: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
7a90: 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
7aa0: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
7ab0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
7ac0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
7ad0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
7ae0: 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
7af0: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
7b00: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
7b10: 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29   %d %d %d (unix)
7b20: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
7b30: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
7b40: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
7b50: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
7b60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
7b70: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
7b80: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
7b90: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
7ba0: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
7bb0: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
7bc0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
7bd0: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
7be0: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
7bf0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
7c00: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
7c10: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
7c20: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
7c30: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
7c40: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
7c50: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
7c60: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
7c70: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
7c80: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
7c90: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
7ca0: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
7cb0: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
7cc0: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
7cd0: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
7ce0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
7cf0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
7d00: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
7d10: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
7d20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
7d30: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
7d40: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
7d50: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
7d60: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
7d70: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
7d80: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
7d90: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
7da0: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
7db0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
7dc0: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
7dd0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
7de0: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
7df0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
7e00: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
7e10: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
7e20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
7e30: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
7e40: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
7e50: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
7e60: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
7e70: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
7e80: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
7e90: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
7ea0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
7eb0: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
7ec0: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
7ed0: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
7ee0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
7ef0: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
7f00: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
7f10: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
7f20: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
7f30: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
7f40: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
7f50: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
7f60: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
7f70: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
7f80: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
7f90: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
7fa0: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
7fb0: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
7fc0: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
7fd0: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
7fe0: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
7ff0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
8000: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
8010: 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20  windows systems 
8020: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20  simultaneously. 
8030: 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68   ** accessing th
8040: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
8050: 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68  file, in case th
8060: 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69  at is ever requi
8070: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  red..  **.  ** S
8080: 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69  ymbols defined i
8090: 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79  n os.h indentify
80a0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
80b0: 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73  te' and the 'res
80c0: 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27  erved.  ** byte'
80d0: 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79  , each single by
80e0: 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77  tes at well know
80f0: 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74  n offsets, and t
8100: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
8110: 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72    ** range', a r
8120: 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65  ange of 510 byte
8130: 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77  s at a well know
8140: 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20  n offset..  **. 
8150: 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20   ** To obtain a 
8160: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72  SHARED lock, a r
8170: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  ead-lock is obta
8180: 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e  ined on the 'pen
8190: 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e  ding.  ** byte'.
81a0: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63    If this is suc
81b0: 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f  cessful, a rando
81c0: 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20  m byte from the 
81d0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
81e0: 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64  * range' is read
81f0: 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  -locked and the 
8200: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e  lock on the 'pen
8210: 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61  ding byte' relea
8220: 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  sed..  **.  ** A
8230: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
8240: 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  y obtain a RESER
8250: 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  VED lock after i
8260: 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c  t has a SHARED l
8270: 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45  ock..  ** A RESE
8280: 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70  RVED lock is imp
8290: 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62  lemented by grab
82a0: 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  bing a write-loc
82b0: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72  k on the.  ** 'r
82c0: 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a  eserved byte'. .
82d0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
82e0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
82f0: 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ain a PENDING lo
8300: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
8310: 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20  obtained a.  ** 
8320: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50  SHARED lock. A P
8330: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69  ENDING lock is i
8340: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
8350: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
8360: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
8370: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e   'pending byte'.
8380: 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
8390: 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44  at no new SHARED
83a0: 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20   locks can be.  
83b0: 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74  ** obtained, but
83c0: 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44   existing SHARED
83d0: 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77   locks are allow
83e0: 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41  ed to persist. A
83f0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f   process.  ** do
8400: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f  es not have to o
8410: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
8420: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79   lock on the way
8430: 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   to a PENDING lo
8440: 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  ck..  ** This pr
8450: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62  operty is used b
8460: 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  y the algorithm 
8470: 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  for rolling back
8480: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
8490: 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61    ** after a cra
84a0: 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  sh..  **.  ** An
84b0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
84c0: 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20   obtained after 
84d0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
84e0: 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20  s held, is.  ** 
84f0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
8500: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
8510: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74  -lock on the ent
8520: 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65  ire 'shared byte
8530: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69  .  ** range'. Si
8540: 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f  nce all other lo
8550: 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65  cks require a re
8560: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f  ad-lock on one o
8570: 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a  f the bytes.  **
8580: 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e   within this ran
8590: 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  ge, this ensures
85a0: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c   that no other l
85b0: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ocks are held on
85c0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
85d0: 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  se. .  **.  ** T
85e0: 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67  he reason a sing
85f0: 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62  le byte cannot b
8600: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
8610: 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  f the 'shared by
8620: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
8630: 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73  s that some vers
8640: 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20  ions of windows 
8650: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72  do not support r
8660: 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20  ead-locks. By.  
8670: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e  ** locking a ran
8680: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20  dom byte from a 
8690: 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e  range, concurren
86a0: 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d  t SHARED locks m
86b0: 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76  ay exist.  ** ev
86c0: 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e  en if the lockin
86d0: 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64  g primitive used
86e0: 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69   is always a wri
86f0: 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  te-lock..  */.  
8700: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8710: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
8720: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
8730: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
8740: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
8750: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
8760: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
8770: 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 20 3d 20 30  ock;.  int s = 0
8780: 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d  ;.  int tErrno =
8790: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
87a0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
87b0: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
87c0: 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
87d0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
87e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
87f0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
8800: 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
8810: 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
8820: 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46  Lock),.      azF
8830: 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e  ileLock(pInode->
8840: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f  eFileLock), pIno
8850: 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65  de->nShared , ge
8860: 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20  tpid()));..  /* 
8870: 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
8880: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
8890: 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
88a0: 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
88b0: 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
88c0: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
88d0: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
88e0: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
88f0: 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
8900: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
8910: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
8920: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
8930: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
8940: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
8950: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
8960: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
8970: 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29  ady held) (unix)
8980: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
8990: 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
89a0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
89b0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
89c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
89d0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
89e0: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
89f0: 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  ce is correct.. 
8a00: 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
8a10: 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
8a20: 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
8a30: 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
8a40: 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
8a50: 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
8a60: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
8a70: 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
8a80: 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
8a90: 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
8aa0: 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
8ab0: 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
8ac0: 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
8ad0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
8ae0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
8af0: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
8b00: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
8b10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
8b20: 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
8b30: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
8b40: 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
8b50: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
8b60: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
8b70: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
8b80: 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
8b90: 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
8ba0: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
8bb0: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
8bc0: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
8bd0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
8be0: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
8bf0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
8c00: 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
8c10: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
8c20: 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
8c30: 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
8c40: 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
8c50: 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
8c60: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
8c70: 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
8c80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
8c90: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
8ca0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
8cb0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
8cc0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
8cd0: 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
8ce0: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
8cf0: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
8d00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8d10: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
8d20: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
8d30: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
8d40: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
8d50: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
8d60: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
8d70: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
8d80: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
8d90: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
8da0: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
8db0: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
8dc0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
8dd0: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
8de0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
8df0: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
8e00: 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
8e10: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
8e20: 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
8e30: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
8e40: 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
8e50: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
8e60: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
8e70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
8e80: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
8e90: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8ea0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
8eb0: 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
8ec0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
8ed0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
8ee0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
8ef0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
8f00: 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ck++;.    goto e
8f10: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20  nd_lock;.  }... 
8f20: 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
8f30: 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
8f40: 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
8f50: 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
8f60: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
8f70: 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
8f80: 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
8f90: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
8fa0: 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
8fb0: 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
8fc0: 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f  ..  */.  lock.l_
8fd0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b  len = 1L;.  lock
8fe0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
8ff0: 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c  _SET;.  if( eFil
9000: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
9010: 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
9020: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
9030: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
9040: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
9050: 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
9060: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
9070: 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
9080: 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b  RED_LOCK?F_RDLCK
9090: 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c  :F_WRLCK);.    l
90a0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
90b0: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
90c0: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
90d0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
90e0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d  ck);.    if( s==
90f0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45  (-1) ){.      tE
9100: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
9110: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
9120: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
9130: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
9140: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
9150: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
9160: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
9170: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
9180: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
9190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
91a0: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
91b0: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
91c0: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
91d0: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
91e0: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
91f0: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
9200: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
9210: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
9220: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
9230: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
9240: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
9250: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
9260: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
9270: 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
9280: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
9290: 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  leLock==0 );..  
92a0: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
92b0: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
92c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
92d0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
92e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
92f0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
9300: 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c 28   if( (s = fcntl(
9310: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
9320: 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29  K, &lock))==(-1)
9330: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
9340: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a   = errno;.    }.
9350: 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
9360: 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
9370: 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
9380: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
9390: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
93a0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
93b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
93c0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
93d0: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
93e0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
93f0: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  k)!=0 ){.      i
9400: 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20  f( s != -1 ){.  
9410: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
9420: 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20  uld happen with 
9430: 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20  a network mount 
9440: 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  */.        tErrn
9450: 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20  o = errno; .    
9460: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
9470: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
9480: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
9490: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
94a0: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
94b0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
94c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
94d0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
94e0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
94f0: 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
9500: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  nd_lock;.      }
9510: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
9520: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
9530: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
9540: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
9550: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
9560: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
9570: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
9580: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
9590: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
95a0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
95b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
95c0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
95d0: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
95e0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
95f0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
9600: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
9610: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
9620: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
9630: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9640: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
9650: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
9660: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
9670: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
9680: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
9690: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
96a0: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
96b0: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
96c0: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
96d0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
96e0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
96f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
9700: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
9710: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
9720: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
9730: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
9740: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
9750: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
9760: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
9770: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
9780: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
9790: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
97a0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
97b0: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
97c0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
97d0: 20 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65     switch( eFile
97e0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 63 61  Lock ){.      ca
97f0: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
9800: 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  :.        lock.l
9810: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
9820: 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20  D_BYTE;.        
9830: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9840: 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e EXCLUSIVE_LOCK
9850: 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  :.        lock.l
9860: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
9870: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
9880: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
9890: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  ED_SIZE;.       
98a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65   break;.      de
98b0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61  fault:.        a
98c0: 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a  ssert(0);.    }.
98d0: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46      s = fcntl(pF
98e0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
98f0: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   &lock);.    if(
9900: 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   s==(-1) ){.    
9910: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
9920: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
9930: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
9940: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
9950: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
9960: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
9970: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
9980: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
9990: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
99a0: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
99b0: 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64   }.  }.  ..#ifnd
99c0: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53  ef NDEBUG.  /* S
99d0: 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  et up the transa
99e0: 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68  ction-counter ch
99f0: 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c  ange checking fl
9a00: 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72  ags when.  ** tr
9a10: 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
9a20: 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52   a SHARED to a R
9a30: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54  ESERVED lock.  T
9a40: 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66  he change.  ** f
9a50: 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45  rom SHARED to RE
9a60: 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65  SERVED marks the
9a70: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
9a80: 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74  normal.  ** writ
9a90: 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74  e operation (not
9aa0: 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72   a hot journal r
9ab0: 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20  ollback)..  */. 
9ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9ad0: 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e  OK.   && pFile->
9ae0: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
9af0: 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69  D_LOCK.   && eFi
9b00: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
9b10: 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
9b20: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
9b30: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
9b40: 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
9b50: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
9b60: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
9b70: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
9b80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9b90: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
9ba0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
9bb0: 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
9bc0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
9bd0: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
9be0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
9bf0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
9c00: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
9c10: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
9c20: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
9c30: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
9c40: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
9c50: 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  ..end_lock:.  un
9c60: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
9c70: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
9c80: 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e      %d %s %s (un
9c90: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
9ca0: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
9cb0: 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
9cc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
9cd0: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
9ce0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
9cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
9d00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9d10: 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61   used by file ha
9d20: 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68  ndle pFile to th
9d30: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
9d40: 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  ** pUnused list.
9d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9d60: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69  setPendingFd(uni
9d70: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
9d80: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9d90: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
9da0: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
9db0: 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c  usedFd *p = pFil
9dc0: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d  e->pUnused;.  p-
9dd0: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
9de0: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f  >pUnused;.  pIno
9df0: 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b  de->pUnused = p;
9e00: 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31  .  pFile->h = -1
9e10: 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  ;.  pFile->pUnus
9e20: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
9e30: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
9e40: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
9e50: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
9e60: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
9e70: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
9e80: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
9e90: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
9ea0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
9eb0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
9ec0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
9ed0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
9ee0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
9ef0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
9f00: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
9f10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
9f20: 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  no-op..** .** If
9f30: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
9f40: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
9f50: 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e  n downgrading an
9f60: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
9f70: 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65  to SHARED.** the
9f80: 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64   byte range is d
9f90: 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61  ivided into 2 pa
9fa0: 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73  rts and the firs
9fb0: 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b  t part is unlock
9fc0: 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74  ed then.** set t
9fd0: 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74  o a read lock, t
9fe0: 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61  hen the other pa
9ff0: 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c  rt is simply unl
a000: 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72  ocked.  This wor
a010: 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20  ks .** around a 
a020: 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c  bug in BSD NFS l
a030: 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20  ockd (also seen 
a040: 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29  on MacOSX 10.3+)
a050: 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a   that fails to .
a060: 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72  ** remove the wr
a070: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65  ite lock on a re
a080: 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64  gion when a read
a090: 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f   lock is set..*/
a0a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 70 6f 73  .static int _pos
a0b0: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
a0c0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
a0d0: 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61  FileLock, int ha
a0e0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a  ndleNFSUnlock){.
a0f0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
a100: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
a110: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
a120: 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
a130: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
a140: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
a150: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b 0a  TE_OK;.  int h;.
a160: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
a190: 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
a1a0: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a 20 20 61  l errors */..  a
a1b0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
a1c0: 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
a1d0: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
a1e0: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
a1f0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
a200: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
a210: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
a220: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
a230: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
a240: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
a250: 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67  nShared,.      g
a260: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
a270: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
a280: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
a290: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
a2a0: 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
a2b0: 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
a2c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
a2d0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
a2e0: 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e  );.  h = pFile->
a2f0: 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  h;.  pInode = pF
a300: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
a310: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
a320: 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
a330: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
a340: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
a350: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a360: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
a370: 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
a380: 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  ck );.    Simula
a390: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
a3a0: 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  1);.    Simulate
a3b0: 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
a3c0: 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ).    SimulateIO
a3d0: 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
a3e0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
a3f0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
a400: 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
a410: 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
a420: 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
a430: 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
a440: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
a450: 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
a460: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
a470: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
a480: 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
a490: 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
a4a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
a4b0: 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
a4c0: 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
a4d0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
a4e0: 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
a4f0: 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
a500: 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
a510: 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
a520: 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
a530: 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
a540: 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
a550: 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
a560: 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
a570: 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
a580: 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
a590: 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
a5a0: 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
a5b0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
a5c0: 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20 61 73   */.#if 0.    as
a5d0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
a5e0: 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
a5f0: 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
a600: 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20  >dbUpdate==0.   
a610: 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
a620: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
a630: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70   );.#endif.    p
a640: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
a650: 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
a660: 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64  .    /* downgrad
a670: 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20  ing to a shared 
a680: 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f  lock on NFS invo
a690: 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68  lves clearing th
a6a0: 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20  e write lock.   
a6b0: 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62   ** before estab
a6c0: 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64  lishing the read
a6d0: 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20  lock - to avoid 
a6e0: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
a6f0: 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20   we downgrade.  
a700: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e    ** the lock in
a710: 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68   2 blocks, so th
a720: 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  at part of the r
a730: 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76  ange will be cov
a740: 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a  ered by a .    *
a750: 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74  * write lock unt
a760: 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63  il the rest is c
a770: 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64  overed by a read
a780: 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31   lock:.    **  1
a790: 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20  :   [WWWWW].    
a7a0: 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d  **  2:   [....W]
a7b0: 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52  .    **  3:   [R
a7c0: 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a  RRRW].    **  4:
a7d0: 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a     [RRRR.].    *
a7e0: 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  /.    if( eFileL
a7f0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
a800: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61   ){.      if( ha
a810: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
a820: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
a830: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
a840: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
a850: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
a860: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
a870: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
a880: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
a890: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
a8a0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
a8b0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
a8c0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
a8d0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
a8e0: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
a8f0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  TLK, &lock)==(-1
a900: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
a910: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
a920: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
a930: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
a940: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
a950: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
a960: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
a970: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
a980: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
a990: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
a9a0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
a9b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a9c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
a9d0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
a9e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
a9f0: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
aa00: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
aa10: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
aa20: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
aa30: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
aa40: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
aa50: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
aa60: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
aa70: 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c   fcntl(h, F_SETL
aa80: 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  K, &lock)==(-1) 
aa90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
aaa0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
aab0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
aac0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
aad0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
aae0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
aaf0: 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
ab00: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
ab10: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
ab20: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ab30: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ab40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ab50: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
ab60: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
ab70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
ab80: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
ab90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
aba0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
abb0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
abc0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
abd0: 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20  RST+divSize;.   
abe0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
abf0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69  = SHARED_SIZE-di
ac00: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
ac10: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
ac20: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  TLK, &lock)==(-1
ac30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
ac40: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
ac50: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
ac60: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
ac70: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
ac80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
ac90: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
aca0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
acb0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
acc0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
acd0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
ace0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
acf0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
ad00: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
ad10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ad20: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
ad30: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
ad40: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
ad50: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
ad60: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
ad70: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
ad80: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
ad90: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
ada0: 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66  SIZE;.        if
adb0: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
adc0: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
add0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
ade0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
adf0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ae00: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
ae10: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
ae20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
ae30: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
ae40: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
ae50: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
ae60: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
ae70: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
ae80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ae90: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
aea0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
aeb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
aec0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
aed0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
aee0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
aef0: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
af00: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
af10: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
af20: 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
af30: 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
af40: 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
af50: 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 66  YTE );.    if( f
af60: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
af70: 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b   &lock)!=(-1) ){
af80: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
af90: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
afa0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
afb0: 65 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  e{.      tErrno 
afc0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
afd0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
afe0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
aff0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
b000: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
b010: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
b020: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
b030: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
b040: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
b050: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
b060: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
b070: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69   }.  }.  if( eFi
b080: 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
b090: 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ){.    /* Decrem
b0a0: 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
b0b0: 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
b0c0: 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
b0d0: 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
b0e0: 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
b0f0: 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
b100: 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
b110: 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
b120: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
b130: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
b140: 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
b150: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
b160: 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
b170: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
b180: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
b190: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
b1a0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
b1b0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
b1c0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
b1d0: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
b1e0: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
b1f0: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
b200: 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
b210: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
b220: 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
b230: 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28        if( fcntl(
b240: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
b250: 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)!=(-1) ){.    
b260: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
b270: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
b280: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b290: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
b2a0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
b2b0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
b2c0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
b2d0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
b2e0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
b2f0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
b300: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
b310: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
b320: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
b330: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b340: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
b350: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
b360: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
b370: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
b380: 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
b390: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
b3a0: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
b3b0: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
b3c0: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
b3d0: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
b3e0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
b3f0: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
b400: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
b410: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
b420: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
b430: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
b440: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
b450: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
b460: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
b470: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
b480: 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
b490: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
b4a0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
b4b0: 20 69 6e 74 20 72 63 32 20 3d 20 63 6c 6f 73 65   int rc2 = close
b4c0: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
b4d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
b4e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b4f0: 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
b500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b510: 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a  }...end_unlock:.
b520: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
b530: 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
b540: 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
b550: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
b560: 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
b570: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
b580: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
b590: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
b5a0: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
b5b0: 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
b5c0: 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
b5d0: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
b5e0: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
b5f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
b600: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
b610: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
b620: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
b630: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
b640: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
b650: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
b660: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
b670: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
b680: 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
b690: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
b6a0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
b6b0: 20 72 65 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e   return _posixUn
b6c0: 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
b6d0: 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ck, 0);.}../*.**
b6e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
b6f0: 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74  erforms the part
b700: 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20  s of the "close 
b710: 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20  file" operation 
b720: 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  .** common to al
b730: 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  l locking scheme
b740: 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65  s. It closes the
b750: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66   directory and f
b760: 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20  ile.** handles, 
b770: 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69  if they are vali
b780: 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20  d, and sets all 
b790: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e  fields of the un
b7a0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
b7b0: 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  ure to 0..**.** 
b7c0: 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65  It is *not* nece
b7d0: 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  ssary to hold th
b7e0: 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69  e mutex when thi
b7f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b800: 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20  led,.** even on 
b810: 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65  VxWorks.  A mute
b820: 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72  x will be acquir
b830: 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79  ed on VxWorks by
b840: 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52   the.** vxworksR
b850: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72  eleaseFileId() r
b860: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
b870: 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46  c int closeUnixF
b880: 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ile(sqlite3_file
b890: 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
b8a0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
b8b0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20  File*)id;.  if( 
b8c0: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  pFile ){.    if(
b8d0: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
b8e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
b8f0: 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  r = close(pFile-
b900: 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20 69  >dirfd);.      i
b910: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
b920: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
b930: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
b940: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b950: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
b960: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
b970: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64          pFile->d
b980: 69 72 66 64 3d 2d 31 3b 0a 20 20 20 20 20 20 7d  irfd=-1;.      }
b990: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
b9a0: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
b9b0: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63 6c      int err = cl
b9c0: 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ose(pFile->h);. 
b9d0: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
b9e0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
b9f0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
ba00: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ba10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
ba20: 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OSE;.      }.   
ba30: 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
ba40: 53 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  S.    if( pFile-
ba50: 3e 70 49 64 20 29 7b 0a 20 20 20 20 20 20 69 66  >pId ){.      if
ba60: 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74  ( pFile->isDelet
ba70: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 6c  e ){.        unl
ba80: 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e  ink(pFile->pId->
ba90: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
baa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76  .      }.      v
bab0: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
bac0: 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
bad0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 49  .      pFile->pI
bae0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  d = 0;.    }.#en
baf0: 64 69 66 0a 20 20 20 20 4f 53 54 52 41 43 45 28  dif.    OSTRACE(
bb00: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
bb10: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
bb20: 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d     OpenCounter(-
bb30: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
bb40: 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
bb50: 73 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  sed);.    memset
bb60: 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
bb70: 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
bb80: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
bb90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
bba0: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
bbb0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
bbc0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
bbd0: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
bbe0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bbf0: 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
bc00: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
bc10: 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
bc20: 20 20 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69      unixUnlock(i
bc30: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
bc40: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
bc50: 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
bc60: 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
bc70: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
bc80: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
bc90: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
bca0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
bcb0: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
bcc0: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
bcd0: 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
bce0: 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
bcf0: 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
bd00: 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
bd10: 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
bd20: 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
bd30: 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
bd40: 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
bd50: 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
bd60: 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 20 20  y closed .      
bd70: 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
bd80: 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
bd90: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
bda0: 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
bdb0: 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
bdc0: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
bdd0: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20  (pFile);.    rc 
bde0: 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
bdf0: 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  id);.    unixLea
be00: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20  veMutex();.  }. 
be10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
be20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
be30: 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20  nd of the posix 
be40: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d  advisory lock im
be50: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
be70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
beb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
bec0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
bed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
bf10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
bf30: 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  o-op Locking ***
bf40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
bf60: 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72  **.** Of the var
bf70: 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ious locking imp
bf80: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61  lementations ava
bf90: 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20  ilable, this is 
bfa0: 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69  by far the.** si
bfb0: 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67  mplest:  locking
bfc0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f   is ignored.  No
bfd0: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
bfe0: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74   to lock the dat
bff0: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f  abase.** file fo
c000: 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  r reading or wri
c010: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ting..**.** This
c020: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
c030: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
c040: 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c   use on read-onl
c050: 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28  y databases.** (
c060: 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68  ex: databases th
c070: 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e  at are burned in
c080: 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65  to CD-ROM, for e
c090: 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e  xample.)  It can
c0a0: 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64  .** also be used
c0b0: 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   if the applicat
c0c0: 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65  ion employs some
c0d0: 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e   external mechan
c0e0: 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e  ism to.** preven
c0f0: 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61  t simultaneous a
c100: 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d  ccess of the sam
c110: 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77  e database by tw
c120: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74  o or more.** dat
c130: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c140: 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  s.  But there is
c150: 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20   a serious risk 
c160: 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  of database.** c
c170: 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69  orruption if thi
c180: 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
c190: 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74  s used in situat
c1a0: 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69  ions where multi
c1b0: 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ple.** database 
c1c0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
c1d0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
c1e0: 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
c1f0: 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   at the same.** 
c200: 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20  time and one or 
c210: 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f  more of those co
c220: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72  nnections are wr
c230: 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69  iting..*/..stati
c240: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63  c int nolockChec
c250: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
c260: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
c270: 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  sed, int *pResOu
c280: 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
c290: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
c2a0: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b  .  *pResOut = 0;
c2b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c2c0: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
c2d0: 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  t nolockLock(sql
c2e0: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
c2f0: 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
c300: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
c310: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
c320: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
c330: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c340: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
c350: 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
c360: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
c370: 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
c380: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
c390: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
c3a0: 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
c3b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c3c0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
c3d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
c3e0: 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  t nolockClose(sq
c3f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
c400: 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  {.  return close
c410: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
c420: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
c430: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
c440: 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
c450: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
c460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c470: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
c480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
c4c0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
c4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c510: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
c520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
c530: 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
c540: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
c550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c560: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
c570: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
c580: 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
c590: 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
c5a0: 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
c5b0: 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72 64 65 72  * files in order
c5c0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
c5d0: 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
c5e0: 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  se.  This works 
c5f0: 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74  on just.** about
c600: 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65   every filesyste
c610: 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42  m imaginable.  B
c620: 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72  ut there are ser
c630: 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a  ious downsides:.
c640: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
c650: 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63  ere is zero conc
c660: 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67  urrency.  A sing
c670: 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73  le reader blocks
c680: 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20   all other.**   
c690: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
c6a0: 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f  s from reading o
c6b0: 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  r writing the da
c6c0: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
c6d0: 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61   (2)  An applica
c6e0: 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f  tion crash or po
c6f0: 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61  wer loss can lea
c700: 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69  ve stale lock fi
c710: 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  les.**         s
c720: 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68  itting around th
c730: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  at need to be cl
c740: 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a  eared manually..
c750: 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65  **.** Neverthele
c760: 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73  ss, a dotlock is
c770: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
c780: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72  locking mode for
c790: 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74   use if no.** ot
c7a0: 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  her locking stra
c7b0: 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c  tegy is availabl
c7c0: 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65  e..**.** Dotfile
c7d0: 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62   locking works b
c7e0: 79 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c  y creating a fil
c7f0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  e in the same di
c800: 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 0a 2a  rectory as the.*
c810: 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77  * database and w
c820: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
c830: 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c  e but with a ".l
c840: 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61  ock" extension a
c850: 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69  dded..** The exi
c860: 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b  stance of a lock
c870: 20 66 69 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e   file implies an
c880: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
c890: 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b    All other lock
c8a0: 0a 2a 2a 20 74 79 70 65 73 20 28 53 48 41 52 45  .** types (SHARE
c8b0: 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e  D, RESERVED, PEN
c8c0: 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64  DING) are mapped
c8d0: 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e   into EXCLUSIVE.
c8e0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .*/../*.** The f
c8f0: 69 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64  ile suffix added
c900: 20 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73   to the data bas
c910: 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72  e filename in or
c920: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  der to create th
c930: 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a  e.** lock file..
c940: 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f  */.#define DOTLO
c950: 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b  CK_SUFFIX ".lock
c960: 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "../*.** This ro
c970: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
c980: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
c990: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
c9a0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
c9b0: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
c9c0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
c9d0: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
c9e0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
c9f0: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
ca00: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
ca10: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
ca20: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
ca30: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
ca40: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
ca50: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
ca60: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
ca70: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
ca80: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a  ock checking..**
ca90: 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c  .** In dotfile l
caa0: 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61  ocking, either a
cab0: 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20   lock exists or 
cac0: 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f  it does not.  So
cad0: 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69   in this.** vari
cae0: 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65  ation of CheckRe
caf0: 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70  servedLock(), *p
cb00: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
cb10: 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63   true if any loc
cb20: 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20  k.** is held on 
cb30: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c  the file and fal
cb40: 73 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  se if the file i
cb50: 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73  s unlocked..*/.s
cb60: 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
cb70: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
cb80: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
cb90: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
cba0: 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t) {.  int rc = 
cbb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
cbc0: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
cbd0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
cbe0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
cbf0: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
cc00: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
cc10: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
cc20: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
cc30: 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
cc40: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  le );..  /* Chec
cc50: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
cc60: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
cc70: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
cc80: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
cc90: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
cca0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
ccb0: 45 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e  Either this conn
ccc0: 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f  ection or some o
ccd0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
cce0: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
ccf0: 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73  ess.    ** holds
cd00: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
cd10: 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ile.  No need to
cd20: 20 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20   check further. 
cd30: 2a 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  */.    reserved 
cd40: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
cd50: 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73    /* The lock is
cd60: 20 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c   held if and onl
cd70: 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c  y if the lockfil
cd80: 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
cd90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63  const char *zLoc
cda0: 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63  kFile = (const c
cdb0: 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
cdc0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
cdd0: 72 65 73 65 72 76 65 64 20 3d 20 61 63 63 65 73  reserved = acces
cde0: 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d  s(zLockFile, 0)=
cdf0: 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  =0;.  }.  OSTRAC
ce00: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
ce10: 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f   %d %d %d (dotlo
ce20: 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
ce30: 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
ce40: 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ;.  *pResOut = r
ce50: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
ce60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
ce70: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
ce80: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
ce90: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
cea0: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
ceb0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
cec0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
ced0: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
cee0: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
cef0: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
cf00: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
cf10: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
cf20: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
cf30: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
cf40: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
cf50: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
cf60: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
cf70: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
cf80: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
cf90: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
cfa0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
cfb0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
cfc0: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
cfd0: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
cfe0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
cff0: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
d000: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
d010: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
d020: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
d030: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
d040: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
d050: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
d060: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
d070: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
d080: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
d090: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
d0a0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
d0b0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
d0c0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
d0d0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
d0e0: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
d0f0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
d100: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
d110: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
d120: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
d130: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
d140: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
d150: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
d160: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
d170: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
d180: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ng level..**.** 
d190: 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63  With dotfile loc
d1a0: 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20  king, we really 
d1b0: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61  only support sta
d1c0: 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56  te (4): EXCLUSIV
d1d0: 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61  E..** But we tra
d1e0: 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63  ck the other loc
d1f0: 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65  king levels inte
d200: 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rnally..*/.stati
d210: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  c int dotlockLoc
d220: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
d230: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
d240: 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
d250: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
d260: 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
d270: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
d280: 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
d290: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
d2a0: 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ext;.  int rc = 
d2b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f  SQLITE_OK;...  /
d2c0: 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79  * If we have any
d2d0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
d2e0: 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64  lock file alread
d2f0: 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77  y exists.  All w
d300: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
d310: 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20  o is adjust our 
d320: 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
d330: 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65  of the lock leve
d340: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  l..  */.  if( pF
d350: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
d360: 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20   NO_LOCK ){.    
d370: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d380: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 23 69   = eFileLock;.#i
d390: 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
d3a0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61    /* Always upda
d3b0: 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  te the timestamp
d3c0: 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65   on the old file
d3d0: 20 2a 2f 0a 20 20 20 20 75 74 69 6d 65 73 28 7a   */.    utimes(z
d3e0: 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
d3f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
d400: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d410: 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
d420: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
d430: 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28   */.  fd = open(
d440: 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e  zLockFile,O_RDON
d450: 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  LY|O_CREAT|O_EXC
d460: 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28 20 66  L,0600);.  if( f
d470: 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  d<0 ){.    /* fa
d480: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
d490: 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f  ate the file, so
d4a0: 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68  meone else may h
d4b0: 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c  ave stolen the l
d4c0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  ock */.    int t
d4d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d4e0: 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d     if( EEXIST ==
d4f0: 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
d500: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
d510: 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
d520: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d530: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
d540: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
d550: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
d560: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
d570: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
d580: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
d590: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
d5a0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
d5b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
d5c0: 20 20 7d 20 0a 20 20 69 66 28 20 63 6c 6f 73 65    } .  if( close
d5d0: 28 66 64 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  (fd) ){.    pFil
d5e0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
d5f0: 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53  rrno;.    rc = S
d600: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
d610: 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  E;.  }.  .  /* g
d620: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
d630: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
d640: 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
d650: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
d660: 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
d670: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
d680: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
d690: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
d6a0: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
d6b0: 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
d6c0: 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
d6d0: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
d6e0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
d6f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
d700: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
d710: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d720: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
d730: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
d740: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
d750: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
d760: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
d770: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
d780: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
d790: 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
d7a0: 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
d7b0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
d7c0: 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
d7d0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
d7e0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
d7f0: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
d800: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
d810: 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
d820: 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
d830: 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
d840: 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73  gContext;..  ass
d850: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
d860: 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
d870: 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
d880: 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
d890: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
d8a0: 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69  ileLock,..   pFi
d8b0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
d8c0: 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
d8d0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
d8e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
d8f0: 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
d900: 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
d910: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
d920: 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
d930: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d940: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
d950: 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f   To downgrade to
d960: 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20   shared, simply 
d970: 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
d980: 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68  nal notion of th
d990: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  e.  ** lock stat
d9a0: 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d  e.  No need to m
d9b0: 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c  ess with the fil
d9c0: 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  e on disk..  */.
d9d0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d9e0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d9f0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
da00: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
da10: 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
da20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
da30: 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75  .  /* To fully u
da40: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
da50: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  se, delete the l
da60: 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73  ock file */.  as
da70: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
da80: 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  =NO_LOCK );.  if
da90: 28 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69  ( unlink(zLockFi
daa0: 6c 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  le) ){.    int r
dab0: 63 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  c = 0;.    int t
dac0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
dad0: 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
dae0: 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
daf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
db00: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
db10: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
db20: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
db30: 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
db40: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
db50: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
db60: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
db70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
db80: 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
db90: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
dba0: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
dbb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dbc0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
dbd0: 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ile.  Make sure 
dbe0: 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
dbf0: 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72  n released befor
dc00: 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e closing..*/.st
dc10: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
dc20: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
dc30: 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
dc40: 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  rc;.  if( id ){.
dc50: 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
dc60: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
dc70: 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b  )id;.    dotlock
dc80: 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
dc90: 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  CK);.    sqlite3
dca0: 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
dcb0: 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
dcc0: 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  }.  rc = closeUn
dcd0: 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65  ixFile(id);.  re
dce0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a  turn rc;.}./****
dcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
dd00: 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69  nd of the dot-fi
dd10: 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  le lock implemen
dd20: 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
dd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
dd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
dd90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ddb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ddc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ddd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
dde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ddf0: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f  ****** Begin flo
de00: 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ck Locking *****
de10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
de20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
de30: 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28  * Use the flock(
de40: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  ) system call to
de50: 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   do file locking
de60: 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  ..**.** flock() 
de70: 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
de80: 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  dot-file locking
de90: 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72   in that the var
dea0: 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61  ious.** fine-gra
deb0: 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  in locking level
dec0: 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53  s supported by S
ded0: 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70  QLite are collap
dee0: 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  sed into.** a si
def0: 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c  ngle exclusive l
df00: 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ock.  In other w
df10: 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45  ords, SHARED, RE
df20: 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50  SERVED, and.** P
df30: 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65  ENDING locks are
df40: 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20   the same thing 
df50: 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  as an EXCLUSIVE 
df60: 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a  lock.  SQLite.**
df70: 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65   still works whe
df80: 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62  n you do this, b
df90: 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69  ut concurrency i
dfa0: 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a  s reduced since.
dfb0: 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
dfc0: 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20   process can be 
dfd0: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
dfe0: 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a  base at a time..
dff0: 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20  **.** Omit this 
e000: 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  section if SQLIT
e010: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
e020: 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64  _STYLE is turned
e030: 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f   off or if.** co
e040: 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f  mpiling for VXWO
e050: 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  RKS..*/.#if SQLI
e060: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
e070: 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
e080: 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
e090: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
e0a0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
e0b0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
e0c0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
e0d0: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
e0e0: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
e0f0: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
e100: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
e110: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
e120: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
e130: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
e140: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
e150: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
e160: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
e170: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
e180: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
e190: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
e1a0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
e1b0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
e1c0: 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
e1d0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
e1e0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
e1f0: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
e200: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e210: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
e220: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
e230: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
e240: 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
e250: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
e260: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
e270: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
e280: 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
e290: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
e2a0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
e2b0: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
e2c0: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
e2d0: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
e2e0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e2f0: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
e300: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
e310: 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
e320: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
e330: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
e340: 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
e350: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
e360: 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
e370: 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
e380: 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
e390: 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e   = flock(pFile->
e3a0: 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
e3b0: 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21  K_NB);.    if( !
e3c0: 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
e3d0: 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e  got the lock, un
e3e0: 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20  lock it */.     
e3f0: 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69   lrc = flock(pFi
e400: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
e410: 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
e420: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
e430: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e440: 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
e450: 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
e460: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
e470: 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
e480: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
e490: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
e4a0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20  _IOERR_UNLOCK); 
e4b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
e4c0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
e4d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
e4e0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e4f0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
e500: 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
e510: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e520: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
e530: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
e540: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72  rno;.      reser
e550: 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  ved = 1;.      /
e560: 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  * someone else m
e570: 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
e580: 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c  erved */.      l
e590: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e5a0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e5b0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e5c0: 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  ERR_LOCK); .    
e5d0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
e5e0: 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
e5f0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e600: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
e610: 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
e620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e630: 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
e640: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
e650: 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d %d (flock)\n",
e660: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
e670: 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64  eserved));..#ifd
e680: 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
e690: 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
e6a0: 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
e6b0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
e6c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
e6d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e6e0: 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  OK;.    reserved
e6f0: 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  =1;.  }.#endif /
e700: 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
e710: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
e720: 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20  S */.  *pResOut 
e730: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
e740: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e750: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
e760: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
e770: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
e780: 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
e790: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
e7a0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
e7b0: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
e7c0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
e7d0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
e7e0: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
e7f0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
e800: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
e810: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
e820: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
e830: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
e840: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
e850: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
e860: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
e870: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
e880: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
e890: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
e8a0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
e8b0: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
e8c0: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
e8d0: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
e8e0: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
e8f0: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
e900: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
e910: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
e920: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
e930: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
e940: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
e950: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
e960: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
e970: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
e980: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
e990: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
e9a0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
e9b0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
e9c0: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
e9d0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
e9e0: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
e9f0: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
ea00: 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
ea10: 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
ea20: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
ea30: 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
ea40: 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
ea50: 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
ea60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
ea70: 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
ea80: 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
ea90: 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
eaa0: 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
eab0: 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
eac0: 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
ead0: 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
eae0: 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
eaf0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
eb00: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
eb10: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
eb20: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
eb30: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
eb40: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
eb50: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
eb60: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
eb70: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
eb80: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
eb90: 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
eba0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
ebb0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
ebc0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
ebd0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
ebe0: 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
ebf0: 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
ec00: 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
ec10: 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
ec20: 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
ec30: 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
ec40: 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
ec50: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
ec60: 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
ec70: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ec80: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
ec90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eca0: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
ecb0: 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
ecc0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69  e lock */.  .  i
ecd0: 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  f (flock(pFile->
ece0: 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
ecf0: 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74  K_NB)) {.    int
ed00: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ed10: 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67  .    /* didn't g
ed20: 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79  et, must be busy
ed30: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
ed40: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
ed50: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
ed60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
ed70: 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
ed80: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
ed90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
eda0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
edb0: 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
edc0: 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c  {.    /* got it,
edd0: 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
ede0: 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
edf0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
ee00: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
ee10: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
ee20: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
ee30: 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
ee40: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
ee50: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
ee60: 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
ee70: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
ee80: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69  : "failed"));.#i
ee90: 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
eea0: 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
eeb0: 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
eec0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
eed0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
eee0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
eef0: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
ef00: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
ef10: 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
ef20: 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
ef30: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
ef40: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
ef50: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
ef60: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
ef70: 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
ef80: 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
ef90: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
efa0: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
efb0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
efc0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
efd0: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
efe0: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
eff0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
f000: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
f010: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
f020: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
f030: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
f040: 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
f050: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f060: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
f070: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
f080: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
f090: 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
f0a0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
f0b0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
f0c0: 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
f0d0: 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20  =%d (flock)\n", 
f0e0: 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
f0f0: 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
f100: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f110: 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
f120: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
f130: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
f140: 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
f150: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
f160: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
f170: 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
f180: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f190: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
f1a0: 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
f1b0: 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
f1c0: 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
f1d0: 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
f1e0: 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
f1f0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
f200: 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
f210: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
f220: 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
f230: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
f240: 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
f250: 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  ly, unlock. */. 
f260: 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28   int rc = flock(
f270: 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
f280: 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a  N);.  if (rc) {.
f290: 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72 6e      int r, tErrn
f2a0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
f2b0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f2c0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f2d0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f2e0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
f2f0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
f300: 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  (r) ){.      pFi
f310: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f320: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69  tErrno;.    }.#i
f330: 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
f340: 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
f350: 52 4f 52 53 0a 20 20 20 20 69 66 28 20 28 72 20  RORS.    if( (r 
f360: 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
f370: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
f380: 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 53 51 4c  ){.      r = SQL
f390: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
f3a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f3b0: 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
f3c0: 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
f3d0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 3b 0a   .    return r;.
f3e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 70    } else {.    p
f3f0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
f400: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  = NO_LOCK;.    r
f410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f420: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
f430: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
f440: 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
f450: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
f460: 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
f470: 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e  d ){.    flockUn
f480: 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
f490: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f4a0: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
f4b0: 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
f4c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
f4d0: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
f4e0: 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a  OS_VXWORK */../*
f4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f500: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c  ** End of the fl
f510: 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ock lock impleme
f520: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
f590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5b0: 2a 2a 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e 20 4e 61  ******* Begin Na
f600: 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f  med Semaphore Lo
f610: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
f620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f630: 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
f640: 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
f650: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
f660: 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
f670: 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   Semaphore locki
f680: 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c  ng is like dot-l
f690: 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e  ock and flock in
f6a0: 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20   that it really 
f6b0: 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73  only.** supports
f6c0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69   EXCLUSIVE locki
f6d0: 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  ng.  Only a sing
f6e0: 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72  le process can r
f6f0: 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20  ead or write.** 
f700: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f710: 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  e at a time.  Th
f720: 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e  is reduces poten
f730: 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79  tial concurrency
f740: 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74  , but.** makes t
f750: 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  he lock implemen
f760: 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69  tation much easi
f770: 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  er..*/.#if OS_VX
f780: 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
f790: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
f7a0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
f7b0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
f7c0: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
f7d0: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
f7e0: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
f7f0: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
f800: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
f810: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
f820: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
f830: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
f840: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
f850: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
f860: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
f870: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
f880: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
f890: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
f8a0: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
f8b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f8c0: 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
f8d0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
f8e0: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
f8f0: 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
f900: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
f910: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
f920: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
f930: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
f940: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
f950: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
f960: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
f970: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
f980: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
f990: 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
f9a0: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
f9b0: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
f9c0: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
f9d0: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
f9e0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
f9f0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
fa00: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
fa10: 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
fa20: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
fa30: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
fa40: 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
fa50: 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
fa60: 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
fa70: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
fa80: 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  em;.    struct s
fa90: 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20  tat statBuf;..  
faa0: 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
fab0: 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
fac0: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
fad0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
fae0: 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72  f( EAGAIN != tEr
faf0: 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rno ){.        r
fb00: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
fb10: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
fb20: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
fb30: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
fb40: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  LOCK);.        p
fb50: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
fb60: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
fb70: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
fb80: 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
fb90: 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68   has the lock wh
fba0: 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f  en we are in NO_
fbb0: 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20  LOCK */.        
fbc0: 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c  reserved = (pFil
fbd0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53  e->eFileLock < S
fbe0: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
fbf0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
fc00: 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
fc10: 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
fc20: 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
fc30: 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
fc40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
fc50: 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
fc60: 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
fc70: 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
fc80: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
fc90: 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
fca0: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
fcb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
fcc0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
fcd0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
fce0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
fcf0: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
fd00: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
fd10: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
fd20: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
fd30: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
fd40: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
fd50: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
fd60: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
fd70: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
fd80: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
fd90: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
fda0: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
fdb0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
fdc0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
fdd0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
fde0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
fdf0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
fe00: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
fe10: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
fe20: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
fe30: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
fe40: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
fe50: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
fe60: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
fe70: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
fe80: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
fe90: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
fea0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
feb0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
fec0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
fed0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
fee0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
fef0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
ff00: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
ff10: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
ff20: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
ff30: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
ff40: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
ff50: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
ff60: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
ff70: 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
ff80: 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  s only really su
ff90: 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
ffa0: 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
ffb0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
ffc0: 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
ffd0: 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
ffe0: 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
fff0: 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
10000 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
10010 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
10020 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
10030 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
10040 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
10050 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
10060 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10070 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
10080 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
10090 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
100a0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
100b0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
100c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
100d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
100e0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
100f0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
10100 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
10110 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10120 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
10130 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53   fd;.  sem_t *pS
10140 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
10150 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20  de->pSem;.  int 
10160 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10170 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
10180 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
10190 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
101a0 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
101b0 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
101c0 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
101d0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
101e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
101f0 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
10200 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
10210 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
10220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10230 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
10240 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
10250 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72  /* lock semaphor
10260 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f  e now but bail o
10270 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20  ut when already 
10280 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28  locked. */.  if(
10290 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
102a0 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63  m)==-1 ){.    rc
102b0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
102c0 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
102d0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
102e0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
102f0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
10300 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
10310 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
10320 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64  eLock;.. sem_end
10330 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20  _lock:.  return 
10340 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
10350 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
10360 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
10370 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
10380 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
10390 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
103a0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
103b0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
103c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
103d0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
103e0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
103f0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
10400 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
10410 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
10420 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
10430 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
10440 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
10450 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   semUnlock(sqlit
10460 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
10470 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
10480 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10490 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
104a0 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
104b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
104c0 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  pSem;..  assert(
104d0 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
104e0 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53  rt( pSem );.  OS
104f0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
10500 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
10510 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46  =%d (sem)\n", pF
10520 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
10530 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65 46  k,..   pFile->eF
10540 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28  ileLock, getpid(
10550 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
10560 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
10570 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
10580 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
10590 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
105a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
105b0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
105c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
105d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
105e0 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
105f0 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
10600 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
10610 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
10620 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
10630 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
10640 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
10650 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
10660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10670 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
10680 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b  o, really unlock
10690 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f  . */.  if ( sem_
106a0 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  post(pSem)==-1 )
106b0 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74   {.    int rc, t
106c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
106d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
106e0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
106f0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
10700 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
10710 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
10720 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
10730 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10740 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
10750 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
10760 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
10770 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
10780 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
10790 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
107a0 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65   ** Close a file
107b0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
107c0 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65   semClose(sqlite
107d0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
107e0 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
107f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
10800 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
10810 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c     semUnlock(id,
10820 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61   NO_LOCK);.    a
10830 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
10840 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
10850 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ex();.    releas
10860 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
10870 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
10880 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f  Mutex();.    clo
10890 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
108a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
108b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
108c0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
108d0 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  */./*.** Named s
108e0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
108f0 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
10900 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  le on VxWorks..*
10910 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10920 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d  * End of the nam
10930 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
10940 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
10950 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10960 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a00 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
10a20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e  Begin AFP Lockin
10a30 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
10a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a50 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73  ***.**.** AFP is
10a60 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e   the Apple Filin
10a70 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50  g Protocol.  AFP
10a80 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69   is a network fi
10a90 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a  lesystem found.*
10aa0 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e  * on Apple Macin
10ab0 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d  tosh computers -
10ac0 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53   both OS9 and OS
10ad0 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70  X..**.** Third-p
10ae0 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74  arty implementat
10af0 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20  ions of AFP are 
10b00 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
10b10 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a  this code here.*
10b20 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20  * only works on 
10b30 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  OSX..*/..#if def
10b40 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
10b50 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
10b60 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
10b70 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b  *.** The afpLock
10b80 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63  ingContext struc
10b90 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c  ture contains al
10ba0 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69  l afp lock speci
10bb0 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70  fic state.*/.typ
10bc0 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c  edef struct afpL
10bd0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66  ockingContext af
10be0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  pLockingContext;
10bf0 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69  .struct afpLocki
10c00 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e  ngContext {.  in
10c10 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f  t reserved;.  co
10c20 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
10c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10c40 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
10c50 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74  n file */.};..st
10c60 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
10c70 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e  ckPB2.{.  unsign
10c80 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
10c90 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f  set;        /* o
10ca0 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
10cb0 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  yte to lock */. 
10cc0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
10cd0 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20  ong length;     
10ce0 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74     /* nbr of byt
10cf0 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
10d00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
10d10 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74  ng retRangeStart
10d20 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20  ; /* nbr of 1st 
10d30 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73  byte locked if s
10d40 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75  uccessful */.  u
10d50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c  nsigned char unL
10d60 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20  ockFlag;        
10d70 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20   /* 1 = unlock, 
10d80 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  0 = lock */.  un
10d90 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72  signed char star
10da0 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20  tEndFlag;       
10db0 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20  /* 1=rel to end 
10dc0 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74  of fork, 0=rel t
10dd0 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74  o start */.  int
10de0 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e00 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61  * file desc to a
10e10 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77  ssoc this lock w
10e20 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ith */.};..#defi
10e30 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  ne afpfsByteRang
10e40 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20  eLock2FSCTL     
10e50 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33     _IOWR('z', 23
10e60 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
10e70 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a  geLockPB2)../*.*
10e80 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
10e90 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ity for setting 
10ea0 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69  or clearing a bi
10eb0 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20  t-range lock on 
10ec0 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79  an.** AFP filesy
10ed0 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74  stem..** .** Ret
10ee0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
10ef0 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45   success, SQLITE
10f00 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65  _BUSY on failure
10f10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10f20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f  afpSetLock(.  co
10f30 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f50 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
10f60 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72   to be locked or
10f70 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75   unlocked */.  u
10f80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10fa0 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
10fb0 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f  iptor on path */
10fc0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
10fd0 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20   long offset,   
10fe0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
10ff0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
11000 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
11010 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20  long length,    
11020 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
11030 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
11040 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67   int setLockFlag
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11060 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c  /* True to set l
11070 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63  ock.  False to c
11080 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  lear lock */.){.
11090 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e    struct ByteRan
110a0 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20  geLockPB2 pb;.  
110b0 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62  int err;.  .  pb
110c0 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65  .unLockFlag = se
110d0 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20  tLockFlag ? 0 : 
110e0 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64  1;.  pb.startEnd
110f0 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f  Flag = 0;.  pb.o
11100 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a  ffset = offset;.
11110 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65    pb.length = le
11120 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d  ngth; .  pb.fd =
11130 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20   pFile->h;.  .  
11140 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54  OSTRACE(("AFPSET
11150 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64  LOCK [%s] for %d
11160 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78  %s in range %llx
11170 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28  :%llx\n", .    (
11180 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22  setLockFlag?"ON"
11190 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e  :"OFF"), pFile->
111a0 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b  h, (pb.fd==-1?"[
111b0 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c  testval-1]":""),
111c0 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e  .    offset, len
111d0 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66  gth));.  err = f
111e0 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73  sctl(path, afpfs
111f0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
11200 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20  CTL, &pb, 0);.  
11210 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b  if ( err==-1 ) {
11220 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
11230 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
11240 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
11250 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61  (("AFPSETLOCK fa
11260 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20  iled to fsctl() 
11270 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20  '%s' %d %s\n",. 
11280 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
11290 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72  , tErrno, strerr
112a0 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69  or(tErrno)));.#i
112b0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
112c0 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
112d0 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  RS.    rc = SQLI
112e0 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20  TE_BUSY;.#else. 
112f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
11300 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
11310 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  r(tErrno,.      
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
11330 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49  tLockFlag ? SQLI
11340 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20  TE_IOERR_LOCK : 
11350 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
11360 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  OCK);.#endif /* 
11370 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
11380 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  P_LOCK_ERRORS */
11390 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
113a0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
113b0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
113c0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
113d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
113e0 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
113f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11400 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
11410 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
11420 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
11430 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
11440 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
11450 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
11460 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
11470 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
11480 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
11490 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
114a0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
114b0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
114c0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
114d0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
114e0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
114f0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
11500 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
11510 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
11520 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
11530 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
11540 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73   int afpCheckRes
11550 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
11560 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
11570 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
11580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11590 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
115a0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
115b0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
115c0 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
115d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
115e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
115f0 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
11600 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
11610 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
11620 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
11630 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
11640 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
11650 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
11660 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20  gContext;.  if( 
11670 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
11680 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75  d ){.    *pResOu
11690 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  t = 1;.    retur
116a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
116b0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
116c0 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
116d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
116e0 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
116f0 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f  hreads */.  .  /
11700 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
11710 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
11720 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
11730 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
11740 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
11750 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
11760 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
11770 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
11780 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
11790 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
117a0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
117b0 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21  t..   */.  if( !
117c0 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
117d0 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45  /* lock the RESE
117e0 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20  RVED byte */.   
117f0 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65   int lrc = afpSe
11800 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
11810 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
11820 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
11830 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c  );  .    if( SQL
11840 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20  ITE_OK==lrc ){. 
11850 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75       /* if we su
11860 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e  cceeded in takin
11870 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c  g the reserved l
11880 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74  ock, unlock it t
11890 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20  o restore.      
118a0 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
118b0 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c  state */.      l
118c0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
118d0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
118e0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
118f0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
11900 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
11910 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64   /* if we failed
11920 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
11930 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c   then someone el
11940 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20  se must have it 
11950 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  */.      reserve
11960 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
11970 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
11980 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
11990 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20   rc=lrc;.    }. 
119a0 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
119b0 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
119c0 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
119d0 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66 70  CK %d %d %d (afp
119e0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
119f0 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
11a00 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20    .  *pResOut = 
11a10 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11a20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11a30 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
11a40 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
11a50 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
11a60 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
11a70 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
11a80 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
11a90 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
11aa0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
11ab0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
11ac0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
11ad0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11ae0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11af0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11b00 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11b10 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
11b20 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
11b30 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
11b40 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
11b50 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
11b60 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
11b70 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
11b80 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
11b90 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
11ba0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
11bb0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11bc0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11bd0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11be0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11bf0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11c00 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11c10 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
11c20 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
11c30 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
11c40 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
11c50 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
11c60 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
11c70 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
11c80 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
11c90 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
11ca0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
11cb0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11cc0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11cd0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11ce0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11cf0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11d00 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11d10 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11d20 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11d30 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
11d40 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
11d50 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b  atic int afpLock
11d60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11d70 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
11d80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11d90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
11da0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11db0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
11dc0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
11dd0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
11de0 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
11df0 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
11e00 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
11e10 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
11e20 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
11e30 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
11e40 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
11e50 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
11e60 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
11e70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
11e80 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
11e90 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
11ea0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
11eb0 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
11ec0 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
11ed0 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
11ee0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
11ef0 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  k), pInode->nSha
11f00 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29  red , getpid()))
11f10 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
11f20 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
11f30 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
11f40 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
11f50 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
11f60 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
11f70 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
11f80 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  the afp_end_lock
11f90 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
11fa0 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
11fb0 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
11fc0 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
11fd0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
11fe0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
11ff0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
12000 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
12010 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
12020 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20  held) (afp)\n", 
12030 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
12040 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
12050 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
12060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12070 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
12080 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
12090 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
120a0 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31  correct.  **  (1
120b0 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
120c0 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
120d0 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
120e0 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
120f0 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
12100 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
12110 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
12120 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
12130 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
12140 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
12150 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
12160 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
12170 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
12180 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
12190 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
121a0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
121b0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
121c0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
121d0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
121e0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
121f0 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
12200 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
12210 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
12220 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
12230 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
12240 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
12250 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
12260 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
12270 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
12280 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
12290 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
122a0 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
122b0 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
122c0 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
122d0 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
122e0 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
122f0 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
12300 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
12310 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
12320 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
12330 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
12340 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
12350 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
12360 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
12370 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
12380 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
12390 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
123a0 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72  )).     ){.    r
123b0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
123c0 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
123d0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
123e0 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
123f0 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
12400 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
12410 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
12420 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
12430 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
12440 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
12450 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
12460 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
12470 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
12480 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
12490 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
124a0 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
124b0 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
124c0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
124d0 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
124e0 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
124f0 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
12500 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
12510 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
12520 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
12530 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
12540 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
12550 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
12560 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
12570 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
12580 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
12590 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
125a0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
125b0 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61  ck++;.    goto a
125c0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
125d0 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
125e0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
125f0 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
12600 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
12610 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
12620 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
12630 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
12640 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
12650 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
12660 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
12670 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
12680 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
12690 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
126a0 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
126b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
126c0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
126d0 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
126e0 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
126f0 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
12700 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
12710 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
12720 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
12730 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
12740 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
12750 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
12760 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
12770 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
12780 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
12790 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
127a0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
127b0 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
127c0 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
127d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
127e0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
127f0 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
12800 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
12810 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
12820 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31   ){.    int lrc1
12830 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e  , lrc2, lrc1Errn
12840 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20  o;.    long lk, 
12850 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61  mask;.    .    a
12860 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
12870 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  Shared==0 );.   
12880 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
12890 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
128a0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61  .        .    ma
128b0 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e  sk = (sizeof(lon
128c0 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54  g)==8) ? LARGEST
128d0 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66  _INT64 : 0x7ffff
128e0 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  fff;.    /* Now 
128f0 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
12900 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  k SHARED_LOCK */
12910 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61  .    /* note tha
12920 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66  t the quality of
12930 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
12940 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74  doesn't matter t
12950 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20  hat much */.    
12960 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a  lk = random(); .
12970 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
12980 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d  edByte = (lk & m
12990 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a  ask)%(SHARED_SIZ
129a0 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31  E - 1);.    lrc1
129b0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
129c0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
129d0 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
129e0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
129f0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
12a00 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  , 1, 1);.    if(
12a10 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
12a20 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72  rc1) ){.      lr
12a30 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d  c1Errno = pFile-
12a40 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
12a50 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
12a60 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
12a70 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
12a80 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc2 = afpSetLoc
12a90 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
12aa0 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
12ab0 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
12ac0 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c     .    if( IS_L
12ad0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
12ae0 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
12af0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63  >lastErrno = lrc
12b00 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  1Errno;.      rc
12b10 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67   = lrc1;.      g
12b20 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
12b30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
12b40 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
12b50 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63  rc2) ){.      rc
12b60 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67   = lrc2;.      g
12b70 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
12b80 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
12b90 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f   lrc1 != SQLITE_
12ba0 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20  OK ) {.      rc 
12bb0 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c  = lrc1;.    } el
12bc0 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  se {.      pFile
12bd0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
12be0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
12bf0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
12c00 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
12c10 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
12c20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
12c30 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
12c40 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
12c50 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
12c60 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
12c70 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
12c80 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
12c90 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
12ca0 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73  n this.     ** s
12cb0 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
12cc0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
12cd0 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
12ce0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
12cf0 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
12d00 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
12d10 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
12d20 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
12d30 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
12d40 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
12d50 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
12d60 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
12d70 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
12d80 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
12d90 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
12da0 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
12db0 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
12dc0 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
12dd0 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20    if (eFileLock 
12de0 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  >= RESERVED_LOCK
12df0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
12e00 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f  Lock < RESERVED_
12e10 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
12e20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
12e30 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ERVED lock */.  
12e40 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
12e50 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
12e60 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
12e70 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
12e80 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28   1,1);.      if(
12e90 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20   !failed ){.    
12ea0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
12eb0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
12ec0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
12ed0 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c  (!failed && eFil
12ee0 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49  eLock == EXCLUSI
12ef0 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  VE_LOCK) {.     
12f00 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
12f10 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f  XCLUSIVE lock */
12f20 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
12f30 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68  /* Remove the sh
12f40 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65  ared lock before
12f50 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67   trying the rang
12f60 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74  e.  we'll need t
12f70 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73  o .      ** rees
12f80 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
12f90 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61  ed lock if we ca
12fa0 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70  n't get the  afp
12fb0 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a  Unlock.      */.
12fc0 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c        if( !(fail
12fd0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
12fe0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
12ff0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
13000 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20  IRST +.         
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13020 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
13030 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20  te, 1, 0)) ){.  
13040 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64        int failed
13050 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
13060 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74         /* now at
13070 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68  temmpt to get th
13080 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
13090 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20   range */.      
130a0 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
130b0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
130c0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
130d0 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130f0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
13100 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20  ED_SIZE, 1);.   
13110 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20       if( failed 
13120 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66  && (failed2 = af
13130 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
13140 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13150 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13160 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
13170 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e  FIRST + pInode->
13180 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
13190 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
131a0 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62  /* Can't reestab
131b0 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
131c0 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61  lock.  Sqlite ca
131d0 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69  n't deal, this i
131e0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
131f0 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72   critical I/O er
13200 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ror.          */
13210 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13220 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54  ((failed & SQLIT
13230 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
13240 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c  TE_IOERR) ? fail
13250 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ed2 : .         
13260 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45        SQLITE_IOE
13270 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
13280 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
13290 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20  lock;.        } 
132a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
132b0 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
132c0 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
132d0 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
132e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
132f0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
13300 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
13310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
13320 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13330 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
13340 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
13350 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13360 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
13370 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
13380 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
13390 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
133a0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
133b0 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
133c0 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
133d0 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
133e0 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
133f0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
13400 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
13410 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c   %d %s %s (afp)\
13420 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
13430 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
13440 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  ck), .         r
13450 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
13460 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
13470 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13480 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
13490 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
134a0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
134b0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
134c0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
134d0 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
134e0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
134f0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
13500 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
13510 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
13520 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
13530 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
13540 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
13550 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
13560 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
13570 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
13580 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
13590 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
135a0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
135b0 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
135c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
135d0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
135e0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
135f0 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
13600 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  o *pInode;.  afp
13610 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
13620 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
13630 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
13640 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
13650 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69  ntext;.  int ski
13660 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66  pShared = 0;.#if
13670 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
13680 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d    int h = pFile-
13690 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  >h;.#endif..  as
136a0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
136b0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
136c0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
136d0 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %d,%d) pid=%d (a
136e0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
136f0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
13700 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
13710 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
13720 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
13730 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
13740 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
13750 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
13760 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
13770 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
13780 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
13790 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
137a0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
137b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
137c0 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
137d0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
137e0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
137f0 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
13800 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
13810 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
13820 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
13830 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
13840 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
13850 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
13860 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
13870 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
13880 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
13890 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
138a0 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
138b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
138c0 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66  ign(0);.    .#if
138d0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
138e0 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
138f0 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
13900 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
13910 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
13920 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
13930 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
13940 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
13950 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
13960 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
13970 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
13980 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
13990 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
139a0 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
139b0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
139c0 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
139d0 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
139e0 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
139f0 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
13a00 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
13a10 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
13a20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
13a30 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
13a40 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
13a50 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
13a60 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
13a70 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
13a80 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
13a90 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
13aa0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
13ab0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
13ac0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
13ad0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
13ae0 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
13af0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
13b00 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43  || pFile->transC
13b10 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20  ntrChng==1 );.  
13b20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
13b30 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
13b40 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  if.    .    if( 
13b50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13b60 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13b70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
13b80 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
13b90 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
13ba0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
13bb0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
13bc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
13bd0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
13be0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
13bf0 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
13c00 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20  Shared>1) ){.   
13c10 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d       /* only re-
13c20 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
13c30 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63  ared lock if nec
13c40 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20  essary */.      
13c50 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b    int sharedLock
13c60 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
13c70 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
13c80 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20  edByte;.        
13c90 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
13ca0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
13cb0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
13cc0 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
13cd0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
13ce0 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64        skipShared
13cf0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
13d00 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
13d10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
13d20 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  le->eFileLock>=P
13d30 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
13d40 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
13d50 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
13d60 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
13d70 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
13d80 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28  ;.    } .    if(
13d90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13da0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
13db0 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
13dc0 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65  K && context->re
13dd0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20  served ){.      
13de0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
13df0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
13e00 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
13e10 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
13e20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a      if( !rc ){ .
13e30 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
13e40 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a  >reserved = 0; .
13e50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13e70 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
13e80 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
13e90 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
13ea0 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e  d>1)){.      pIn
13eb0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
13ec0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
13ed0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
13ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
13ef0 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
13f00 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  K ){..    /* Dec
13f10 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
13f20 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
13f30 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
13f40 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
13f50 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
13f60 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
13f70 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
13f80 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
13f90 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
13fa0 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ck..    */.    u
13fb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
13fc0 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  g sharedLockByte
13fd0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
13fe0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
13ff0 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  te;.    pInode->
14000 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
14010 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
14020 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
14030 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
14040 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
14050 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
14060 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
14070 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
14080 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
14090 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29  f( !skipShared )
140a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  {.        rc = a
140b0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
140c0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
140d0 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
140e0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
140f0 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
14100 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
14110 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
14120 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
14130 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14140 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
14150 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
14160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14170 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
14180 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61  nLock--;.      a
14190 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
141a0 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Lock>=0 );.     
141b0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
141c0 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
141d0 20 72 63 20 3d 20 63 6c 6f 73 65 50 65 6e 64 69   rc = closePendi
141e0 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
141f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14200 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
14210 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
14220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
14230 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
14240 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
14250 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14260 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
14270 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
14280 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
14290 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
142a0 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
142b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
142c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
142d0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
142e0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
142f0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14300 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55  le*)id;.    afpU
14310 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
14320 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  K);.    unixEnte
14330 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
14340 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  ( pFile->pInode 
14350 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
14360 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->nLock ){.     
14370 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
14380 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
14390 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
143a0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
143b0 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a  le just.      **
143c0 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
143d0 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
143e0 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
143f0 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
14400 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
14410 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
14420 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
14430 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
14440 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
14450 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
14460 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
14470 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
14480 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
14490 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
144a0 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
144b0 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73  fo(pFile);.    s
144c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
144d0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
144e0 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f  t);.    rc = clo
144f0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
14500 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
14510 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ex();.  }.  retu
14520 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
14530 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
14540 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
14550 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
14560 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
14570 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
14580 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
14590 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
145a0 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
145b0 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
145c0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
145d0 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
145e0 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
145f0 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
14600 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  s available.  If
14610 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69   you don't compi
14620 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68  le for a mac, th
14630 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70  en the "unix-afp
14640 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20  ".** VFS is not 
14650 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
14660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14670 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41  *** End of the A
14680 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
14690 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
14700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
14770 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   NFS Locking ***
14780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
147a0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
147b0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
147c0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
147d0 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77  STYLE./*. ** Low
147e0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
147f0 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
14800 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
14810 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
14820 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20  leLock. ** must 
14830 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
14840 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
14850 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65  .. **. ** If the
14860 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14870 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
14880 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
14890 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a   at or below. **
148a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
148b0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
148c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
148d0 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69  no-op.. */.stati
148e0 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28  c int nfsUnlock(
148f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14900 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14910 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f 73 69  {.  return _posi
14920 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
14930 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65  eLock, 1);.}..#e
14940 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
14950 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
14960 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
14970 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
14980 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
14990 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63  e is the NFS loc
149a0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
149b0 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
149c0 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
149d0 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
149e0 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
149f0 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
14a00 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
14a10 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
14a20 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    .**.**********
14a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
14a40 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  of the NFS lock 
14a50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
14a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a70 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
14a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ac0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
14ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b10 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14b20 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b  ******* Non-lock
14b30 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ing sqlite3_file
14b40 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
14b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b60 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
14b70 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63   next division c
14b80 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e  ontains implemen
14b90 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  tations for all 
14ba0 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a  methods of the .
14bb0 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
14bc0 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61  object other tha
14bd0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  n the locking me
14be0 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b  thods.  The lock
14bf0 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77  ing.** methods w
14c00 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64  ere defined in d
14c10 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28  ivisions above (
14c20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  one locking meth
14c30 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69  od per.** divisi
14c40 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68  on).  Those meth
14c50 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ods that are com
14c60 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
14c70 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20  ng modes.** are 
14c80 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20  gather together 
14c90 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69  into this divisi
14ca0 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  on..*/../*.** Se
14cb0 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
14cc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
14cd0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
14ce0 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a  then read cnt .*
14cf0 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  * bytes into pBu
14d00 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  f. Return the nu
14d10 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
14d20 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a  tually read..**.
14d30 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64  ** NB:  If you d
14d40 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
14d50 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20  or USE_PREAD64, 
14d60 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c  then it might al
14d70 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  so.** be necessa
14d80 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  ry to define _XO
14d90 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65  PEN_SOURCE to be
14da0 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69   500.  This vari
14db0 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73  es from.** one s
14dc0 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72  ystem to another
14dd0 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20  .  Since SQLite 
14de0 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20  does not define 
14df0 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79  USE_PREAD.** any
14e00 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66   any form by def
14e10 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f  ault, we will no
14e20 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66  t attempt to def
14e30 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
14e40 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74  E..** See ticket
14e50 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38  s #2741 and #268
14e60 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  1..**.** To avoi
14e70 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
14e80 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
14e90 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20  failed read the 
14ea0 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
14eb0 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
14ec0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
14ed0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
14ee0 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a  dRead(unixFile *
14ef0 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
14f00 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a  4 offset, void *
14f10 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
14f20 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28    int got;.#if (
14f30 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
14f40 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
14f50 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
14f60 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
14f70 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
14f80 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
14f90 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f  (USE_PREAD).  go
14fa0 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e 68 2c  t = pread(id->h,
14fb0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
14fc0 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  et);.  SimulateI
14fd0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
14fe0 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
14ff0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
15000 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34 28 69   got = pread64(i
15010 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
15020 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75   offset);.  Simu
15030 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
15040 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
15050 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
15060 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
15070 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53  , SEEK_SET);.  S
15080 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
15090 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20  newOffset-- );. 
150a0 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
150b0 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66  offset ){.    if
150c0 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
150d0 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  1 ){.      ((uni
150e0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
150f0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15110 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
15120 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
15130 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ...    }.    ret
15140 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f  urn -1;.  }.  go
15150 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20  t = read(id->h, 
15160 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
15170 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
15180 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
15190 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
151a0 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
151b0 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54  errno;.  }.  OST
151c0 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25  RACE(("READ    %
151d0 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
151e0 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f  lu\n", id->h, go
151f0 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52  t, offset, TIMER
15200 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65  _ELAPSED));.  re
15210 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  turn got;.}../*.
15220 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
15230 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
15240 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
15250 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
15260 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
15270 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
15280 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
15290 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
152a0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
152b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
152c0 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
152d0 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
152e0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
152f0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
15300 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
15310 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15320 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
15330 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
15340 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20 20  ssert( id );..  
15350 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
15360 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
15370 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
15380 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
15390 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
153a0 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
153b0 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
153c0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
153d0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
153e0 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
153f0 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
15400 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
15410 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
15420 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
15430 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
15440 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
15450 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20  ;.#endif..  got 
15460 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
15470 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
15480 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67  f, amt);.  if( g
15490 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72  ot==amt ){.    r
154a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
154b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74  .  }else if( got
154c0 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73  <0 ){.    /* las
154d0 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
154e0 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
154f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
15500 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  OERR_READ;.  }el
15510 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
15520 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a  astErrno = 0; /*
15530 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
15540 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e  ror */.    /* Un
15550 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
15560 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
15570 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
15580 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
15590 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20  ar*)pBuf)[got], 
155a0 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20  0, amt-got);.   
155b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
155c0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
155d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
155e0 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
155f0 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
15600 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
15610 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
15620 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
15630 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
15640 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
15650 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
15660 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
15670 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
15680 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
15690 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73  ed write the las
156a0 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
156b0 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
156c0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
156d0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
156e0 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
156f0 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f  , i64 offset, co
15700 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
15710 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
15720 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e  got;.#if (!defin
15730 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26  ed(USE_PREAD) &&
15740 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52   !defined(USE_PR
15750 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65  EAD64)).  i64 ne
15760 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a  wOffset;.#endif.
15770 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23    TIMER_START;.#
15780 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
15790 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 77  READ).  got = pw
157a0 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
157b0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
157c0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
157d0 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74  E_PREAD64).  got
157e0 20 3d 20 70 77 72 69 74 65 36 34 28 69 64 2d 3e   = pwrite64(id->
157f0 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
15800 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e  fset);.#else.  n
15810 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
15820 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
15830 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28  SEEK_SET);.  if(
15840 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
15850 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65  et ){.    if( ne
15860 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
15870 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
15880 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
15890 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d  o = errno;.    }
158a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e  else{.      ((un
158b0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
158c0 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20  tErrno = 0;.... 
158d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
158e0 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20  -1;.  }.  got = 
158f0 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75  write(id->h, pBu
15900 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
15910 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69    TIMER_END;.  i
15920 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
15930 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
15940 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
15950 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  no;.  }..  OSTRA
15960 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE(("WRITE   %-3
15970 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
15980 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
15990 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45   offset, TIMER_E
159a0 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75  LAPSED));.  retu
159b0 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn got;.}.../*.*
159c0 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
159d0 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
159e0 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
159f0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15a00 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
15a10 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
15a20 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
15a30 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57  static int unixW
15a40 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
15a50 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e  file *id, .  con
15a60 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  st void *pBuf, .
15a70 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
15a80 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
15a90 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  t .){.  unixFile
15aa0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
15ab0 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77  ile*)id;.  int w
15ac0 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
15ad0 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
15ae0 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20  rt( amt>0 );..  
15af0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
15b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
15b10 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
15b20 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
15b30 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
15b40 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
15b50 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
15b60 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
15b70 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
15b80 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
15b90 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
15ba0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
15bb0 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
15bc0 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
15bd0 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
15be0 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
15bf0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
15c00 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
15c10 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
15c20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
15c30 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
15c40 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
15c50 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
15c60 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
15c70 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
15c80 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
15c90 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
15ca0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
15cb0 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
15cc0 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
15cd0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
15ce0 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
15cf0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
15d00 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
15d10 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
15d20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
15d30 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
15d40 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
15d50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
15d60 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
15d70 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
15d80 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
15d90 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
15da0 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
15db0 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
15dc0 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
15dd0 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
15de0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
15df0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
15e00 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
15e10 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
15e20 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
15e30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
15e40 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
15e50 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
15e60 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
15e70 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
15e80 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
15e90 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
15ea0 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
15eb0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
15ec0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
15ed0 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
15ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15ef0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c  }.#endif..  whil
15f00 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f  e( amt>0 && (wro
15f10 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
15f20 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
15f30 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
15f40 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
15f50 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
15f60 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
15f70 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
15f80 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
15f90 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15fa0 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
15fb0 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
15fc0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
15fd0 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
15fe0 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74  1 ));..  if( amt
15ff0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  >0 ){.    if( wr
16000 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  ote<0 ){.      /
16010 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
16020 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
16030 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
16040 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
16050 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
16060 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
16070 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
16080 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
16090 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
160a0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
160b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
160c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
160d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
160e0 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
160f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
16100 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
16110 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
16120 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
16130 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
16140 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
16150 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
16160 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
16170 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
16180 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
16190 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
161a0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
161b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
161c0 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
161d0 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
161e0 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
161f0 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
16200 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
16210 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
16220 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
16230 68 65 20 28 73 6c 6f 77 65 72 29 20 66 73 79 6e  he (slower) fsyn
16240 63 28 29 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 6b  c()..** If you k
16250 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79  now that your sy
16260 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72  stem does suppor
16270 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f  t fdatasync() co
16280 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e  rrectly,.** then
16290 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20   simply compile 
162a0 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63  with -Dfdatasync
162b0 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69  =fdatasync.*/.#i
162c0 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74 61  f !defined(fdata
162d0 73 79 6e 63 29 20 26 26 20 21 64 65 66 69 6e 65  sync) && !define
162e0 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64  d(__linux__).# d
162f0 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
16300 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a  fsync.#endif../*
16310 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f  .** Define HAVE_
16320 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f  FULLFSYNC to 0 o
16330 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 1 depending on
16340 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
16350 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** the F_FULLFSY
16360 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
16370 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e  ned.  F_FULLFSYN
16380 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  C is currently.*
16390 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  * only available
163a0 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42   on Mac OS X.  B
163b0 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68  ut that could ch
163c0 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ange..*/.#ifdef 
163d0 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65  F_FULLFSYNC.# de
163e0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
163f0 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65  YNC 1.#else.# de
16400 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
16410 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  YNC 0.#endif.../
16420 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29  *.** The fsync()
16430 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65   system call doe
16440 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64  s not work as ad
16450 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79  vertised on many
16460 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73  .** unix systems
16470 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
16480 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e   procedure is an
16490 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65   attempt to make
164a0 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74  .** it work bett
164b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  er..**.** The SQ
164c0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63  LITE_NO_SYNC mac
164d0 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20  ro disables all 
164e0 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20  fsync()s.  This 
164f0 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  is useful.** for
16500 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65   testing when we
16510 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72   want to run thr
16520 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75  ough the test su
16530 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20  ite quickly..** 
16540 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79  You are strongly
16550 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74   advised *not* t
16560 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51  o deploy with SQ
16570 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20  LITE_NO_SYNC.** 
16580 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72  enabled, however
16590 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c  , since with SQL
165a0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62  ITE_NO_SYNC enab
165b0 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68  led, an OS crash
165c0 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
165d0 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  lure will likely
165e0 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
165f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
16600 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68  * SQLite sets th
16610 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20  e dataOnly flag 
16620 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  if the size of t
16630 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61  he file is uncha
16640 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65  nged..** The ide
16650 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c  a behind dataOnl
16660 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f  y is that it sho
16670 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  uld only write t
16680 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a  he file content.
16690 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20  ** to disk, not 
166a0 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f  the inode.  We o
166b0 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79  nly set dataOnly
166c0 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a   if the file siz
166d0 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  e is .** unchang
166e0 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c  ed since the fil
166f0 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f  e size is part o
16700 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f  f the inode.  Ho
16710 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54  wever, .** Ted T
16720 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61  s'o tells us tha
16730 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
16740 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  ll also write th
16750 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a  e inode if the.*
16760 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20  * file size has 
16770 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e  changed.  The on
16780 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e  ly real differen
16790 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61  ce between fdata
167a0 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73  sync().** and fs
167b0 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73  ync(), Ted tells
167c0 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61   us, is that fda
167d0 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f  tasync() will no
167e0 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69  t flush the.** i
167f0 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d  node if the mtim
16800 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74  e or owner or ot
16810 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62  her inode attrib
16820 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  utes have change
16830 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61  d..** We only ca
16840 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  re about the fil
16850 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20  e size, not the 
16860 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69  other file attri
16870 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20  butes, so.** as 
16880 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73  far as SQLite is
16890 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66   concerned, an f
168a0 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c  datasync() is al
168b0 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a  ways adequate..*
168c0 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20  * So, we always 
168d0 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20  use fdatasync() 
168e0 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  if it is availab
168f0 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  le, regardless o
16900 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  f.** the value o
16910 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  f the dataOnly f
16920 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lag..*/.static i
16930 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e  nt full_fsync(in
16940 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79  t fd, int fullSy
16950 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  nc, int dataOnly
16960 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
16970 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
16980 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73   "ifdef/elif/els
16990 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68  e/" block has th
169a0 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65  e same structure
169b0 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65   as.  ** the one
169c0 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65   below. It is re
169d0 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f  plicated here so
169e0 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c  lely to avoid cl
169f0 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75  uttering .  ** u
16a00 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20  p the real code 
16a10 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f  with the UNUSED_
16a20 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72  PARAMETER() macr
16a30 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  os..  */.#ifdef 
16a40 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
16a50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
16a60 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
16a70 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
16a80 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
16a90 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
16aa0 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  );.#elif HAVE_FU
16ab0 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  LLFSYNC.  UNUSED
16ac0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
16ad0 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nly);.#else.  UN
16ae0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
16af0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
16b00 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
16b10 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a  aOnly);.#endif..
16b20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
16b30 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
16b40 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72  that we do a nor
16b50 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20  mal fsync() and 
16b60 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20  .  ** FULLSYNC. 
16b70 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75   This is used du
16b80 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20  ring testing to 
16b90 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
16ba0 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
16bb0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68  gets called with
16bc0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67   the correct arg
16bd0 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66  uments..  */.#if
16be0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16bf0 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
16c00 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
16c10 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  c_count++;.  sql
16c20 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
16c30 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
16c40 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
16c50 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
16c60 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
16c70 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
16c80 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
16c90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
16ca0 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49  SYNC.  rc = SQLI
16cb0 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56  TE_OK;.#elif HAV
16cc0 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
16cd0 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
16ce0 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c    rc = fcntl(fd,
16cf0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
16d00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
16d10 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
16d20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
16d30 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
16d40 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
16d50 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a   an fsync()..  *
16d60 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
16d70 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
16d80 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
16d90 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
16da0 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20   ** file system 
16db0 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
16dc0 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
16dd0 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
16de0 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74  ** isn't support
16df0 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
16e00 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
16e10 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
16e20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77   ** and (for now
16e30 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
16e40 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
16e50 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
16e60 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62  l.  .  ** It'd b
16e70 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
16e80 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
16e90 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
16ea0 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63  oid .  ** the fc
16eb0 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
16ec0 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
16ed0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ed..  */.  if( r
16ee0 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66  c ) rc = fsync(f
16ef0 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e  d);..#elif defin
16f00 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
16f10 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f  /* fdatasync() o
16f20 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79  n HFS+ doesn't y
16f30 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c  et flush the fil
16f40 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61  e size if it cha
16f50 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  nged correctly. 
16f60 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79   ** so currently
16f70 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74   we default to t
16f80 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65  he macro that re
16f90 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e  defines fdatasyn
16fa0 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a  c to fsync.  */.
16fb0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
16fc0 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20  ;.#else .  rc = 
16fd0 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23  fdatasync(fd);.#
16fe0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
16ff0 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72  if( rc==-1 && er
17000 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a  rno==ENOTSUP ){.
17010 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
17020 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
17030 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
17040 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
17050 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
17060 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
17070 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f  NC */..  if( OS_
17080 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20  VXWORKS && rc!= 
17090 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  -1 ){.    rc = 0
170a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
170b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
170c0 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
170d0 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
170e0 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
170f0 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
17100 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d  ** If dataOnly==
17110 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20  0 then both the 
17120 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20  file itself and 
17130 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69  its metadata (fi
17140 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65  le.** size, acce
17150 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72  ss time, etc) ar
17160 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61  e synced.  If da
17170 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f  taOnly!=0 then o
17180 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nly the.** file 
17190 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a  data is synced..
171a0 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78  **.** Under Unix
171b0 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65  , also make sure
171c0 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74   that the direct
171d0 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
171e0 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65  e file.** has be
171f0 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73  en created by fs
17200 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65  ync-ing the dire
17210 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
17220 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ins the file..**
17230 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f   If we do not do
17240 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63   this and we enc
17250 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66  ounter a power f
17260 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65  ailure, the dire
17270 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66  ctory.** entry f
17280 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  or the journal m
17290 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61  ight not exist a
172a0 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20  fter we reboot. 
172b0 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c   The next.** SQL
172c0 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68  ite to access th
172d0 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20  e file will not 
172e0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f  know that the jo
172f0 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65  urnal exists (be
17300 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72  cause.** the dir
17310 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
17320 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
17330 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20   never created) 
17340 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
17350 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  ion.** will not 
17360 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73  roll back - poss
17370 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20  ibly leading to 
17380 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17390 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
173a0 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69  nt unixSync(sqli
173b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
173c0 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
173d0 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  rc;.  unixFile *
173e0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
173f0 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73  e*)id;..  int is
17400 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67  DataOnly = (flag
17410 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  s&SQLITE_SYNC_DA
17420 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  TAONLY);.  int i
17430 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61  sFullsync = (fla
17440 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
17450 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f  _SYNC_FULL;..  /
17460 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
17470 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
17480 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
17490 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
174a0 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
174b0 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
174c0 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
174d0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
174e0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
174f0 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63   );..  /* Unix c
17500 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20  annot, but some 
17510 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75  systems may retu
17520 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66  rn SQLITE_FULL f
17530 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20  rom here. This. 
17540 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74   ** line is to t
17550 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73  est that doing s
17560 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  o does not cause
17570 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
17580 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69   */.  SimulateDi
17590 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74  skfullError( ret
175a0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
175b0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
175c0 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
175d0 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c  (("SYNC    %-3d\
175e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
175f0 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e    rc = full_fsyn
17600 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75  c(pFile->h, isFu
17610 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e  llsync, isDataOn
17620 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ly);.  SimulateI
17630 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
17640 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17650 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17660 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
17670 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17680 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69  R_FSYNC;.  }.  i
17690 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e  f( pFile->dirfd>
176a0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72  =0 ){.    int er
176b0 72 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  r;.    OSTRACE((
176c0 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68  "DIRSYNC %-3d (h
176d0 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64  ave_fullfsync=%d
176e0 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22   fullsync=%d)\n"
176f0 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a  , pFile->dirfd,.
17700 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45              HAVE
17710 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75  _FULLFSYNC, isFu
17720 6c 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e 64 65  llsync));.#ifnde
17730 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
17740 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20  _DIRSYNC.    /* 
17750 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  The directory sy
17760 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  nc is only attem
17770 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79  pted if full_fsy
17780 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72  nc is.    ** tur
17790 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61  ned off or unava
177a0 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75  ilable.  If a fu
177b0 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65  ll_fsync occurre
177c0 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20  d above,.    ** 
177d0 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f  then the directo
177e0 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72  ry sync is super
177f0 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  fluous..    */. 
17800 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55     if( (!HAVE_FU
17810 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75  LLFSYNC || !isFu
17820 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f  llsync) && full_
17830 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72  fsync(pFile->dir
17840 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  fd,0,0) ){.     
17850 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57    /*.       ** W
17860 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  e have received 
17870 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73  multiple reports
17880 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75   of fsync() retu
17890 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20  rning.       ** 
178a0 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c  errors when appl
178b0 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69  ied to directori
178c0 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69  es on certain fi
178d0 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  le systems..    
178e0 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64     ** A failed d
178f0 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
17900 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e   not a big deal.
17910 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20    So it seems.  
17920 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74       ** better t
17930 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72  o ignore the err
17940 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35  or.  Ticket #165
17950 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  7.       */.    
17960 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61 73     /* pFile->las
17970 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20  tErrno = errno; 
17980 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74  */.       /* ret
17990 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
179a0 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ; */.    }.#endi
179b0 66 0a 20 20 20 20 65 72 72 20 3d 20 63 6c 6f 73  f.    err = clos
179c0 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b  e(pFile->dirfd);
179d0 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f   /* Only need to
179e0 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63   sync once, so c
179f0 6c 6f 73 65 20 74 68 65 20 2a 2f 0a 20 20 20 20  lose the */.    
17a00 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 20 20 20  if( err==0 ){   
17a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 69             /* di
17a20 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77 65 20  rectory when we 
17a30 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20 20 20  are done */.    
17a40 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d    pFile->dirfd =
17a50 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
17a60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
17a70 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
17a80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17a90 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
17aa0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  E;.    }.  }.  r
17ab0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17ac0 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
17ad0 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
17ae0 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
17af0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54  static int unixT
17b00 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f  runcate(sqlite3_
17b10 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42  file *id, i64 nB
17b20 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  yte){.  unixFile
17b30 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17b40 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
17b50 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  rc;.  assert( pF
17b60 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
17b70 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
17b80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
17b90 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20  UNCATE );..  /* 
17ba0 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
17bb0 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
17bc0 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
17bd0 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20   file, truncate 
17be0 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f  the.  ** file so
17bf0 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74   that it consist
17c00 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  s of an integer 
17c10 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73  number of chunks
17c20 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20   (i.e. the.  ** 
17c30 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65  actual file size
17c40 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
17c50 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67  tion may be larg
17c60 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
17c70 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29  ested.  ** size)
17c80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
17c90 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20  le->szChunk ){. 
17ca0 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79     nByte = ((nBy
17cb0 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68  te + pFile->szCh
17cc0 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e  unk - 1)/pFile->
17cd0 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
17ce0 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a  ->szChunk;.  }..
17cf0 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65    rc = ftruncate
17d00 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f  (pFile->h, (off_
17d10 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  t)nByte);.  if( 
17d20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  rc ){.    pFile-
17d30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17d40 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
17d50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
17d60 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  CATE;.  }else{.#
17d70 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17d80 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
17d90 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
17da0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
17db0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
17dc0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
17dd0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
17de0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
17df0 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
17e00 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
17e10 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
17e20 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
17e30 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
17e40 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
17e50 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
17e60 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
17e70 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
17e80 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
17e90 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
17ea0 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
17eb0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
17ec0 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
17ed0 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
17ee0 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
17ef0 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
17f00 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
17f10 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65  alWrite && nByte
17f20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ==0 ){.      pFi
17f30 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
17f40 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  g = 1;.    }.#en
17f50 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
17f60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
17f70 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
17f80 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
17f90 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
17fa0 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
17fb0 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
17fc0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17fd0 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
17fe0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
17ff0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
18000 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
18010 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78  c = fstat(((unix
18020 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
18030 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  uf);.  SimulateI
18040 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
18050 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
18060 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
18070 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
18080 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
18090 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
180a0 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
180b0 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
180c0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
180d0 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
180e0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
180f0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70  indInodeInfo() p
18100 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72  rocedure.  ** wr
18110 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79  ites a single by
18120 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c  te into that fil
18130 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  e in order to wo
18140 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a  rk around a bug.
18150 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58    ** in the OS-X
18160 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
18170 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  m.  In order to 
18180 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77  avoid problems w
18190 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c  ith upper.  ** l
181a0 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74  ayers, we need t
181b0 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69  o report this fi
181c0 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20  le size as zero 
181d0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
181e0 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e  s.  ** really 1.
181f0 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e     Ticket #3260.
18200 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69  .  */.  if( *pSi
18210 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d  ze==1 ) *pSize =
18220 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53   0;...  return S
18230 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
18240 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
18250 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
18260 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
18270 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72  _)./*.** Handler
18280 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69   for proxy-locki
18290 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ng file-control 
182a0 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20  verbs.  Defined 
182b0 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20  below in the.** 
182c0 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
182d0 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74   division..*/.st
182e0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
182f0 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
18300 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64  3_file*,int,void
18310 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a  *);.#endif../* .
18320 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18330 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61   is called to ha
18340 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f  ndle the SQLITE_
18350 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
18360 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  .** file-control
18370 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
18380 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
18390 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
183a0 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
183b0 69 73 20 66 69 6c 65 2c 20 69 74 20 63 6f 75 6c  is file, it coul
183c0 64 20 62 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  d be.** that the
183d0 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
183e0 65 20 65 78 74 65 6e 64 65 64 20 61 74 20 74 68  e extended at th
183f0 69 73 20 70 6f 69 6e 74 2e 20 4f 74 68 65 72 77  is point. Otherw
18400 69 73 65 2c 20 74 68 65 0a 2a 2a 20 53 51 4c 49  ise, the.** SQLI
18410 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
18420 4e 54 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  NT operation is 
18430 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 55 6e 69 78  a no-op for Unix
18440 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18450 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e  fcntlSizeHint(un
18460 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
18470 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28  64 nByte){.  if(
18480 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
18490 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65  ){.    i64 nSize
184a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
184b0 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
184c0 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
184d0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
184e0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
184f0 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20  /* Used to hold 
18500 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66  return values of
18510 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a   fstat() */.   .
18520 20 20 20 20 69 66 28 20 66 73 74 61 74 28 70 46      if( fstat(pF
18530 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20  ile->h, &buf) ) 
18540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
18550 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20  ERR_FSTAT;..    
18560 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
18570 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
18580 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
18590 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
185a0 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
185b0 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
185c0 73 69 7a 65 20 29 7b 0a 23 69 66 20 64 65 66 69  size ){.#if defi
185d0 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
185e0 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
185f0 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
18600 45 0a 20 20 20 20 20 20 69 66 28 20 70 6f 73 69  E.      if( posi
18610 78 5f 66 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  x_fallocate(pFil
18620 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
18630 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
18640 73 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20  size) ){.       
18650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18660 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
18670 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
18680 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65  /* If the OS doe
18690 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78  s not have posix
186a0 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61  _fallocate(), fa
186b0 6b 65 20 69 74 2e 20 46 69 72 73 74 20 75 73 65  ke it. First use
186c0 0a 20 20 20 20 20 20 2a 2a 20 66 74 72 75 6e 63  .      ** ftrunc
186d0 61 74 65 28 29 20 74 6f 20 73 65 74 20 74 68 65  ate() to set the
186e0 20 66 69 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e   file size, then
186f0 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
18700 62 79 74 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  byte to.      **
18710 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 69   the last byte i
18720 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 77 69 74  n each block wit
18730 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64  hin the extended
18740 20 72 65 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20   region. This.  
18750 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61      ** is the sa
18760 6d 65 20 74 65 63 68 6e 69 71 75 65 20 75 73 65  me technique use
18770 64 20 62 79 20 67 6c 69 62 63 20 74 6f 20 69 6d  d by glibc to im
18780 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61  plement posix_fa
18790 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20 20 20 20  llocate().      
187a0 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73 20 74 68  ** on systems th
187b0 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  at do not have a
187c0 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28   real fallocate(
187d0 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20  ) system call.. 
187e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
187f0 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f  t nBlk = buf.st_
18800 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c  blksize;  /* Fil
18810 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73  e-system block s
18820 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ize */.      i64
18830 20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   iWrite;        
18840 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
18850 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   offset to write
18860 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74   to */.      int
18870 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
18880 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
18890 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 65  rn value from se
188a0 65 6b 41 6e 64 57 72 69 74 65 28 29 20 2a 2f 0a  ekAndWrite() */.
188b0 0a 20 20 20 20 20 20 69 66 28 20 66 74 72 75 6e  .      if( ftrun
188c0 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
188d0 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Size) ){.       
188e0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
188f0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
18900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18910 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b  _IOERR_TRUNCATE;
18920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18930 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74  Write = ((buf.st
18940 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d  _size + 2*nBlk -
18950 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31   1)/nBlk)*nBlk-1
18960 3b 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  ;.      do {.   
18970 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65       nWrite = se
18980 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
18990 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29  , iWrite, "", 1)
189a0 3b 0a 20 20 20 20 20 20 20 20 69 57 72 69 74 65  ;.        iWrite
189b0 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20   += nBlk;.      
189c0 7d 20 77 68 69 6c 65 28 20 6e 57 72 69 74 65 3d  } while( nWrite=
189d0 3d 31 20 26 26 20 69 57 72 69 74 65 3c 6e 53 69  =1 && iWrite<nSi
189e0 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
189f0 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
18a00 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
18a10 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20  WRITE;.#endif.  
18a20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
18a30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18a40 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
18a50 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
18a60 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
18a70 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
18a80 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
18a90 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
18aa0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
18ab0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
18ac0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
18ad0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18ae0 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
18af0 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
18b00 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  = ((unixFile*)id
18b10 29 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  )->eFileLock;.  
18b20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18b30 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18b40 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
18b50 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
18b60 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28  *(int*)pArg = ((
18b70 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
18b80 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
18b90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18bb0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
18bc0 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
18bd0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18be0 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  )->szChunk = *(i
18bf0 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
18c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18c10 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18c20 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
18c30 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
18c40 20 20 72 65 74 75 72 6e 20 66 63 6e 74 6c 53 69    return fcntlSi
18c50 7a 65 48 69 6e 74 28 28 75 6e 69 78 46 69 6c 65  zeHint((unixFile
18c60 20 2a 29 69 64 2c 20 2a 28 69 36 34 20 2a 29 70   *)id, *(i64 *)p
18c70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  Arg);.    }.#ifn
18c80 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
18c90 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
18ca0 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
18cb0 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
18cc0 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
18cd0 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
18ce0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
18cf0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
18d00 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
18d10 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
18d20 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
18d30 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
18d40 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
18d50 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
18d60 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
18d70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
18d80 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
18d90 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
18da0 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
18db0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
18dc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
18dd0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
18de0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18df0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
18e00 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
18e10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54   case SQLITE_SET
18e20 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a  _LOCKPROXYFILE:.
18e30 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18e40 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
18e50 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
18e60 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  n proxyFileContr
18e70 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a  ol(id,op,pArg);.
18e80 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
18e90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
18ea0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
18eb0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18ec0 29 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  ) */.    case SQ
18ed0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f  LITE_FCNTL_SYNC_
18ee0 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20 20  OMITTED: {.     
18ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18f00 4b 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70 20 2a  K;  /* A no-op *
18f10 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
18f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
18f30 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
18f40 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
18f50 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
18f60 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
18f70 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
18f80 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
18f90 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
18fa0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
18fb0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
18fc0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
18fd0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
18fe0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
18ff0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
19000 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
19010 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
19020 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
19030 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
19040 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
19050 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
19060 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
19070 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
19080 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
19090 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
190a0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
190b0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
190c0 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
190d0 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
190e0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
190f0 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
19100 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
19110 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
19120 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
19130 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
19140 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19150 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
19160 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
19170 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
19180 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e  ways 0 for unix.
19190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
191a0 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
191b0 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
191c0 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
191d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
191e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
191f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
19200 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19210 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
19220 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
19230 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
19240 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
19250 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
19260 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
19270 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
19280 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
19290 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
192a0 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
192b0 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
192c0 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
192d0 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
192e0 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
192f0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
19300 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
19310 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
19320 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
19330 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
19340 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
19350 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
19360 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
19370 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
19380 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
19390 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
193a0 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
193b0 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
193c0 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
193d0 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
193e0 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
193f0 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
19400 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
19410 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
19420 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
19430 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
19440 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
19450 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
19460 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
19470 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
19480 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
19490 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
194a0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
194b0 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
194c0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
194d0 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
194e0 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
194f0 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
19500 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
19510 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
19520 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
19530 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
19540 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
19550 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
19560 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
19570 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
19580 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
19590 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
195a0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
195b0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
195c0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
195d0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
195e0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
195f0 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
19600 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
19610 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
19620 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
19630 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
19640 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
19650 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
19660 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
19670 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
19680 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
19690 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
196a0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
196b0 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
196c0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
196d0 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
196e0 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
196f0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
19700 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
19710 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
19720 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
19730 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
19740 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
19750 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
19760 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19780 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
19790 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
197a0 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
197b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
197c0 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
197d0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
197e0 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  t nRegion;      
197f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
19800 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
19810 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  on */.  char **a
19820 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  pRegion;        
19830 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
19840 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  apped shared-mem
19850 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
19860 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
19870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19880 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d  umber of unixShm
19890 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
198a0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75  g to this */.  u
198b0 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  nixShm *pFirst; 
198c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
198d0 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
198e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
198f0 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
19900 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78  TE_DEBUG.  u8 ex
19910 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
19920 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
19930 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
19940 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68   held */.  u8 sh
19950 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
19960 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
19970 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
19980 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53  ld */.  u8 nextS
19990 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
199a0 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
199b0 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20  able unixShm.id 
199c0 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
199d0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  };../*.** Struct
199e0 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
199f0 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
19a00 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
19a10 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
19a20 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
19a30 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
19a40 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19a50 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
19a60 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
19a70 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
19a80 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
19a90 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
19aa0 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69  er:.**.**    uni
19ab0 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20  xShm.pFile.**   
19ac0 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a   unixShm.id.**.*
19ad0 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
19ae0 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
19af0 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e  e.  The unixShm.
19b00 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73  pFile->mutex mus
19b10 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69  t be held.** whi
19b20 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79  le accessing any
19b30 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c   read/write fiel
19b40 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ds..*/.struct un
19b50 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68  ixShm {.  unixSh
19b60 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
19b70 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
19b80 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f  rlying unixShmNo
19b90 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  de object */.  u
19ba0 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  nixShm *pNext;  
19bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
19bc0 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74  t unixShm with t
19bd0 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e  he same unixShmN
19be0 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
19bf0 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
19c00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
19c10 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53  olding the unixS
19c20 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
19c30 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
19c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19c50 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
19c60 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
19c70 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
19c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
19c90 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
19ca0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66  ocks held */.#if
19cb0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
19cc0 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19ce0 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
19cf0 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
19d00 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
19d10 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
19d20 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
19d30 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
19d40 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
19d50 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
19d60 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
19d70 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  )         /* fir
19d80 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
19d90 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
19da0 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48  _DMS    (UNIX_SH
19db0 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
19dc0 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
19dd0 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
19de0 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69  /*.** Apply posi
19df0 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  x advisory locks
19e00 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66   for all bytes f
19e10 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68  rom ofst through
19e20 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a   ofst+n-1..**.**
19e30 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20   Locks block if 
19e40 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63  the mask is exac
19e50 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61  tly UNIX_SHM_C a
19e60 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b  nd are non-block
19e70 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ing.** otherwise
19e80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19e90 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
19ea0 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  k(.  unixShmNode
19eb0 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41   *pShmNode, /* A
19ec0 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
19ed0 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
19ee0 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
19ef0 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c  .  int lockType,
19f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55            /* F_U
19f10 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f  NLCK, F_RDLCK, o
19f20 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  r F_WRLCK */.  i
19f30 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
19f40 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
19f50 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  yte of the locki
19f60 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  ng range */.  in
19f70 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  t n             
19f80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19f90 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
19fa0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
19fb0 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a  lock f;       /*
19fc0 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   The posix advis
19fd0 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ory locking stru
19fe0 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72  cture */.  int r
19ff0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1a000 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1a010 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a  form fcntl() */.
1a020 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
1a030 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1a040 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
1a050 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
1a060 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
1a070 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1a080 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
1a090 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ex) || pShmNode-
1a0a0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
1a0b0 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e  * Shared locks n
1a0c0 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74  ever span more t
1a0d0 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a  han one byte */.
1a0e0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
1a0f0 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44  | lockType!=F_RD
1a100 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  LCK );..  /* Loc
1a110 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ks are within ra
1a120 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nge */.  assert(
1a130 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54   n>=1 && n<SQLIT
1a140 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a  E_SHM_NLOCK );..
1a150 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1a160 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
1a170 6d 65 74 65 72 73 20 2a 2f 0a 20 20 6d 65 6d 73  meters */.  mems
1a180 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&f, 0, sizeof
1a190 28 66 29 29 3b 0a 20 20 66 2e 6c 5f 74 79 70 65  (f));.  f.l_type
1a1a0 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 66   = lockType;.  f
1a1b0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
1a1c0 5f 53 45 54 3b 0a 20 20 66 2e 6c 5f 73 74 61 72  _SET;.  f.l_star
1a1d0 74 20 3d 20 6f 66 73 74 3b 0a 20 20 66 2e 6c 5f  t = ofst;.  f.l_
1a1e0 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 72 63 20 3d  len = n;..  rc =
1a1f0 20 66 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d   fcntl(pShmNode-
1a200 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
1a210 3b 0a 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d  ;.  rc = (rc!=(-
1a220 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  1)) ? SQLITE_OK 
1a230 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a  : SQLITE_BUSY;..
1a240 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1a250 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
1a260 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
1a270 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
1a280 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1a290 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
1a2a0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1a2b0 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28   "));.  mask = (
1a2c0 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
1a2d0 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20  1<<ofst);.  if( 
1a2e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a2f0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
1a300 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
1a310 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
1a320 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
1a330 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
1a340 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
1a350 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
1a360 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
1a370 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1a380 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
1a390 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
1a3a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1a3b0 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  read-lock %d ok"
1a3c0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
1a3d0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1a3e0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1a3f0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
1a400 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
1a410 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a420 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
1a430 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
1a440 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
1a450 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  rite-lock %d ok"
1a460 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
1a470 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1a480 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1a490 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
1a4a0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
1a4b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1a4c0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
1a4d0 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
1a4e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
1a4f0 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
1a500 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ofst));.    }els
1a510 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
1a520 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
1a530 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
1a540 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a  lock failed"));.
1a550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a560 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
1a570 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
1a580 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
1a590 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ite-lock %d fail
1a5a0 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
1a5b0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
1a5c0 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73  ((" - afterwards
1a5d0 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
1a5e0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
1a5f0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20  de->sharedMask, 
1a600 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1a610 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sk));.  }.#endif
1a620 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
1a630 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a        .}.../*.**
1a640 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53   Purge the unixS
1a650 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
1a660 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
1a670 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  ith unixShmNode.
1a680 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
1a690 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
1a6a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
1a6b0 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
1a6c0 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
1a6d0 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
1a6e0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
1a6f0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
1a700 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75  c void unixShmPu
1a710 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  rge(unixFile *pF
1a720 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  d){.  unixShmNod
1a730 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f  e *p = pFd->pIno
1a740 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
1a750 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
1a760 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
1a770 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30   p && p->nRef==0
1a780 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1a790 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49     assert( p->pI
1a7a0 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64  node==pFd->pInod
1a7b0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e );.    if( p->
1a7c0 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f  mutex ) sqlite3_
1a7d0 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
1a7e0 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
1a7f0 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
1a800 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 75 6e   i++){.      mun
1a810 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
1a820 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
1a830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1a840 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
1a850 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  gion);.    if( p
1a860 2d 3e 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70  ->h>=0 ) close(p
1a870 2d 3e 68 29 3b 0a 20 20 20 20 70 2d 3e 70 49 6e  ->h);.    p->pIn
1a880 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
1a890 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
1a8a0 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
1a8b0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72  *.** Open a shar
1a8c0 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
1a8d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f  ssociated with o
1a8e0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1a8f0 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68  e pDbFd.  .** Th
1a900 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d  is particular im
1a910 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
1a920 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e  s mmapped files.
1a930 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  .**.** The file 
1a940 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1a950 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  t shared-memory 
1a960 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  is in the same d
1a970 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74  irectory.** as t
1a980 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1a990 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68   file and has th
1a9a0 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
1a9b0 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1a9c0 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68  .** file with th
1a9d0 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20  e "-shm" suffix 
1a9e0 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d  added.  For exam
1a9f0 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61  ple, if the data
1aa00 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20  base file.** is 
1aa10 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
1aa20 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65  fig.db" then the
1aa30 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72   file that is cr
1aa40 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  eated and mmappe
1aa50 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20  d.** for shared 
1aa60 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63  memory will be c
1aa70 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65  alled "/home/use
1aa80 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d  r1/config.db-shm
1aa90 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68  ".  .**.** Anoth
1aaa0 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69  er approach to i
1aab0 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69  s to use files i
1aac0 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64  n /dev/shm or /d
1aad0 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20  ev/tmp or an.** 
1aae0 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73  some other tmpfs
1aaf0 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61   mount. But if a
1ab00 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65   file in a diffe
1ab10 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a  rent directory.*
1ab20 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  * from the datab
1ab30 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64  ase file is used
1ab40 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67  , then differing
1ab50 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
1ab60 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f  ons.** or a chro
1ab70 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65  ot() might cause
1ab80 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70   two different p
1ab90 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20  rocesses on the 
1aba0 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  same.** database
1abb0 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67   to end up using
1abc0 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73   different files
1abd0 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
1abe0 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67  ry - .** meaning
1abf0 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f   that their memo
1ac00 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61  ry would not rea
1ac10 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20  lly be shared - 
1ac20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20  resulting.** in 
1ac30 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1ac40 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  ion.  Neverthele
1ac50 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66  ss, this tmpfs f
1ac60 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e  ile usage.** can
1ac70 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63   be enabled at c
1ac80 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e  ompile-time usin
1ac90 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44  g -DSQLITE_SHM_D
1aca0 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73  IRECTORY="/dev/s
1acb0 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71  hm".** or the eq
1acc0 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75  uivalent.  The u
1acd0 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  se of the SQLITE
1ace0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63  _SHM_DIRECTORY c
1acf0 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f  ompile-time.** o
1ad00 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ption results in
1ad10 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
1ad20 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65   build of SQLite
1ad30 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c  ;  builds of SQL
1ad40 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68  ite.** that with
1ad50 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54   differing SQLIT
1ad60 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
1ad70 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74  settings attempt
1ad80 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73   to use the.** s
1ad90 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
1ada0 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
1adb0 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72  me, database cor
1adc0 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b  ruption will lik
1add0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54  ely.** result. T
1ade0 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
1adf0 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
1ae00 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63  time option is c
1ae10 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e  onsidered.** "un
1ae20 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d  supported" and m
1ae30 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20  ay go away in a 
1ae40 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65  future SQLite re
1ae50 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  lease..**.** Whe
1ae60 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
1ae70 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1ae80 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
1ae90 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
1aea0 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
1aeb0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
1aec0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
1aed0 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
1aee0 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
1aef0 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
1af00 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1af10 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
1af20 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
1af30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1af40 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
1af50 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
1af60 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
1af70 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
1af80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1af90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1afa0 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
1afb0 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1afc0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a   *pShmNode;   /*
1afd0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1afe0 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1aff0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b010 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1b020 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
1b030 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1b040 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f        /* The ino
1b050 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68  de of fd */.  ch
1b060 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  ar *zShmFilename
1b070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b080 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
1b090 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a  e used for SHM *
1b0a0 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65  /.  int nShmFile
1b0b0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1b0c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b0d0 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20  he SHM filename 
1b0e0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
1b0f0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
1b100 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
1b110 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  xShm object. */.
1b120 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
1b130 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
1b140 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
1b150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1b160 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
1b170 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
1b180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
1b190 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
1b1a0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1b1b0 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
1b1c0 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
1b1d0 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
1b1e0 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
1b1f0 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
1b200 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
1b210 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
1b220 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
1b230 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
1b240 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
1b250 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
1b260 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
1b270 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d  .  if( pShmNode=
1b280 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
1b290 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b2b0 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72  fstat() info for
1b2c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1b2d0 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66  /..    /* Call f
1b2e0 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65  stat() to figure
1b2f0 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73   out the permiss
1b300 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61  ions on the data
1b310 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20  base file. If.  
1b320 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d    ** a new *-shm
1b330 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
1b340 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c  , an attempt wil
1b350 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65  l be made to cre
1b360 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69  ate it.    ** wi
1b370 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  th the same perm
1b380 69 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74  issions. The act
1b390 75 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ual permissions 
1b3a0 74 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61  the file is crea
1b3b0 74 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ted.    ** with 
1b3c0 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74  are subject to t
1b3d0 68 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b  he current umask
1b3e0 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
1b3f0 0a 20 20 20 20 69 66 28 20 66 73 74 61 74 28 70  .    if( fstat(p
1b400 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29  DbFd->h, &sStat)
1b410 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1b420 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1b430 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
1b440 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1b450 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1b460 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
1b470 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
1b480 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f  = sizeof(SQLITE_
1b490 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b  SHM_DIRECTORY) +
1b4a0 20 33 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e   30;.#else.    n
1b4b0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20  ShmFilename = 5 
1b4c0 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44  + (int)strlen(pD
1b4d0 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e  bFd->zPath);.#en
1b4e0 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
1b4f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1b500 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  c( sizeof(*pShmN
1b510 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
1b520 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
1b530 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
1b540 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b550 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1b560 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1b570 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
1b580 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69  (pShmNode, 0, si
1b590 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29  zeof(*pShmNode))
1b5a0 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
1b5b0 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
1b5c0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
1b5d0 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
1b5e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
1b5f0 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
1b600 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1b610 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
1b620 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
1b650 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
1b660 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
1b690 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
1b6a0 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
1b6b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1b6c0 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
1b6d0 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
1b6e0 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d  "%s-shm", pDbFd-
1b6f0 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
1b700 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
1b710 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
1b720 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1b730 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
1b740 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
1b750 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
1b760 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
1b770 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
1b780 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1b790 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1b7a0 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1b7b0 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1b7c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b7d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1b7e0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1b7f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 68  ;.    }..    pSh
1b800 6d 4e 6f 64 65 2d 3e 68 20 3d 20 6f 70 65 6e 28  mNode->h = open(
1b810 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f  zShmFilename, O_
1b820 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 28 73  RDWR|O_CREAT, (s
1b830 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
1b840 37 37 37 29 29 3b 0a 20 20 20 20 69 66 28 20 70  777));.    if( p
1b850 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a  ShmNode->h<0 ){.
1b860 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b870 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
1b880 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1b890 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1b8a0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
1b8b0 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
1b8c0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
1b8d0 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
1b8e0 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
1b8f0 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
1b900 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1b910 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
1b920 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1b930 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  _OK;.    if( uni
1b940 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1b950 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
1b960 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
1b970 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
1b980 0a 20 20 20 20 20 20 69 66 28 20 66 74 72 75 6e  .      if( ftrun
1b990 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
1b9a0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1b9b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1b9c0 52 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20  R_SHMOPEN;.     
1b9d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1b9e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b9f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
1ba00 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1ba10 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b  ShmNode, F_RDLCK
1ba20 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
1ba30 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
1ba40 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
1ba50 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20  open_err;.  }.. 
1ba60 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
1ba70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
1ba80 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53  ild of the unixS
1ba90 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
1baa0 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
1bab0 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  de;.#ifdef SQLIT
1bac0 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
1bad0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
1bae0 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
1baf0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
1bb00 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  ++;.  pDbFd->pSh
1bb10 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61  m = p;.  unixLea
1bb20 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
1bb30 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
1bb40 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
1bb50 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1bb60 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
1bb70 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
1bb80 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e  er of the unixEn
1bb90 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78  terMutex() mutex
1bba0 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72   and the pointer
1bbb0 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e   from the.  ** n
1bbc0 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53  ew (struct unixS
1bbd0 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
1bbe0 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
1bbf0 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
1bc00 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
1bc10 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
1bc20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1bc30 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
1bc40 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
1bc50 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
1bc60 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
1bc70 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
1bc80 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
1bc90 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a  ode->mutex .  **
1bca0 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
1bcb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1bcc0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1bcd0 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
1bce0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
1bcf0 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
1bd00 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
1bd10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1bd20 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1bd30 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1bd40 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
1bd50 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
1bd60 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
1bd70 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50  _err:.  unixShmP
1bd80 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20  urge(pDbFd);    
1bd90 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1bda0 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69  frees pShmNode i
1bdb0 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
1bdc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1bdd0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
1bde0 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
1bdf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1be00 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1be10 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
1be20 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
1be30 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
1be40 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
1be50 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
1be60 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
1be70 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
1be80 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
1be90 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
1bea0 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
1beb0 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
1bec0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
1bed0 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
1bee0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
1bef0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1bf00 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
1bf10 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1bf20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
1bf30 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
1bf40 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1bf50 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65  bExtend paramete
1bf60 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
1bf70 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
1bf80 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
1bf90 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
1bfa0 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
1bfb0 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
1bfc0 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
1bfd0 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
1bfe0 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
1bff0 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
1c000 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1c010 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
1c020 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a  bExtend is non-z
1c030 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
1c040 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1c050 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
1c060 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
1c070 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
1c080 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
1c090 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
1c0a0 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
1c0b0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
1c0c0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1c0d0 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
1c0e0 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
1c0f0 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
1c100 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
1c110 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
1c120 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1c130 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
1c140 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
1c150 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
1c160 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
1c170 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
1c180 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
1c190 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1c1a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1c1b0 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73   unixShmMap(.  s
1c1c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c1e0 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
1c1f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1c200 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c220 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
1c230 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
1c240 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c260 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
1c270 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65  s */.  int bExte
1c280 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
1c290 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
1c2a0 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
1c2b0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
1c2c0 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
1c2d0 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
1c2e0 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
1c2f0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e  emory */.){.  un
1c300 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
1c310 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
1c320 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75   unixShm *p;.  u
1c330 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1c340 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
1c350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1c360 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
1c370 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20  memory file has 
1c380 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
1c390 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
1c3a0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64  . */.  if( pDbFd
1c3b0 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->pShm==0 ){.   
1c3c0 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68   rc = unixOpenSh
1c3d0 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
1c3e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1c3f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1c400 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  n rc;.  }..  p =
1c410 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1c420 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1c430 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65  hmNode;.  sqlite
1c440 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1c450 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c460 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
1c470 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
1c480 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
1c490 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
1c4a0 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
1c4b0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1c4c0 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ion ){.    char 
1c4d0 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20  **apNew;        
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c4f0 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20   New apRegion[] 
1c500 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
1c510 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f   nByte = (iRegio
1c520 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  n+1)*szRegion;  
1c530 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
1c540 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1c550 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1c560 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
1c570 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1c580 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20  by fstat() */.. 
1c590 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
1c5a0 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
1c5b0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ;..    /* The re
1c5c0 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
1c5d0 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
1c5e0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1c5f0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
1c600 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
1c610 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
1c620 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
1c630 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
1c640 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
1c650 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
1c660 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
1c670 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
1c680 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c690 20 66 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d   fstat(pShmNode-
1c6a0 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
1c6b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c6c0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a  _IOERR_SHMSIZE;.
1c6d0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1c6e0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
1c6f0 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f     if( sStat.st_
1c700 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20  size<nByte ){.  
1c710 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1c720 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
1c730 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
1c740 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73  t. If bExtend is
1c750 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a   set to.      **
1c760 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72   false, exit ear
1c770 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
1c780 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1c790 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1c7a0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
1c7b0 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76     ** Alternativ
1c7c0 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20  ely, if bExtend 
1c7d0 69 73 20 74 72 75 65 2c 20 75 73 65 20 66 74 72  is true, use ftr
1c7e0 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f  uncate() to allo
1c7f0 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  cate.      ** th
1c800 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1c810 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20  ry region..     
1c820 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 62   */.      if( !b
1c830 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68  Extend ) goto sh
1c840 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
1c850 20 69 66 28 20 66 74 72 75 6e 63 61 74 65 28 70   if( ftruncate(p
1c860 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74  ShmNode->h, nByt
1c870 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  e) ){.        rc
1c880 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1c890 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
1c8a0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1c8b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1c8c0 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
1c8d0 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1c8e0 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
1c8f0 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
1c900 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
1c910 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72     apNew = (char
1c920 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
1c930 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
1c940 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c  mNode->apRegion,
1c950 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a   (iRegion+1)*siz
1c960 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20  eof(char *).    
1c970 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
1c980 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
1c990 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1c9a0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1c9b0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1c9c0 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  }.    pShmNode->
1c9d0 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77  apRegion = apNew
1c9e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d  ;.    while(pShm
1c9f0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1ca00 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76  Region){.      v
1ca10 6f 69 64 20 2a 70 4d 65 6d 20 3d 20 6d 6d 61 70  oid *pMem = mmap
1ca20 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 20 50 52  (0, szRegion, PR
1ca30 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49  OT_READ|PROT_WRI
1ca40 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4d  TE, .          M
1ca50 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e  AP_SHARED, pShmN
1ca60 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65  ode->h, pShmNode
1ca70 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ->nRegion*szRegi
1ca80 6f 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  on.      );.    
1ca90 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f    if( pMem==MAP_
1caa0 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
1cab0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1cac0 45 52 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ERR;.        got
1cad0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1cae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
1caf0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
1cb00 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1cb10 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20  n] = pMem;.     
1cb20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1cb30 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
1cb40 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
1cb50 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1cb60 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
1cb70 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e  .    *pp = pShmN
1cb80 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52  ode->apRegion[iR
1cb90 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b  egion];.  }else{
1cba0 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
1cbb0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1cbc0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1cbd0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1cbe0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cbf0 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
1cc00 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
1cc10 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
1cc20 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
1cc30 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
1cc40 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
1cc50 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
1cc60 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
1cc70 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
1cc80 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
1cc90 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
1cca0 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
1ccb0 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
1ccc0 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
1ccd0 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
1cce0 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
1ccf0 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
1cd00 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
1cd10 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
1cd20 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
1cd30 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
1cd40 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
1cd50 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63  c int unixShmLoc
1cd60 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
1cd70 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1cd80 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1cd90 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
1cda0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1cdb0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1cdc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1cdd0 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
1cde0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1cdf0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
1ce20 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
1ce30 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1ce40 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
1ce50 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
1ce60 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
1ce70 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
1ce80 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
1ce90 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  nixFile*)fd;    
1cea0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1ceb0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
1cec0 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53  emory */.  unixS
1ced0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1cee0 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1cef0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
1cf00 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
1cf10 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ed */.  unixShm 
1cf20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cf40 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1cf50 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
1cf60 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
1cf70 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
1cf80 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65  ShmNode;  /* The
1cf90 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
1cfa0 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   iNode */.  int 
1cfb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfd0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1cfe0 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1d010 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
1d020 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
1d030 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  */..  assert( pS
1d040 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
1d050 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
1d060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
1d070 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
1d080 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
1d090 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
1d0a0 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
1d0b0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
1d0c0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
1d0d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
1d0e0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1d0f0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1d100 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1d110 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1d120 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
1d130 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1d140 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
1d150 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1d160 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
1d170 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1d180 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1d190 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1d1a0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
1d1b0 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
1d1c0 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
1d1d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1d1e0 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
1d1f0 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
1d200 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
1d210 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
1d220 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
1d230 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
1d240 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1d250 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1d260 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
1d270 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
1d280 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
1d290 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
1d2a0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
1d2b0 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
1d2c0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
1d2d0 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
1d2e0 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
1d2f0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1d300 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1d310 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1d320 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
1d330 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
1d340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1d350 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
1d360 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
1d370 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
1d380 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
1d390 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
1d3a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d3b0 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
1d3c0 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
1d3d0 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
1d3e0 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
1d3f0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
1d400 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1d410 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20  mNode, F_UNLCK, 
1d420 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
1d430 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
1d440 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1d450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
1d460 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
1d470 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
1d480 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1d4a0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
1d4b0 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
1d4c0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
1d4d0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
1d4e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
1d4f0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
1d500 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
1d510 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
1d520 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
1d530 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
1d540 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
1d550 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
1d560 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
1d570 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
1d580 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
1d590 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
1d5a0 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
1d5b0 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
1d5c0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
1d5d0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
1d5e0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
1d5f0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
1d600 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
1d610 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1d620 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
1d630 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
1d640 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
1d650 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
1d660 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1d670 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
1d680 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1d690 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
1d6a0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
1d6b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
1d6c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
1d6d0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
1d6e0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
1d6f0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1d700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d710 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
1d720 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
1d730 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
1d740 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1d750 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
1d760 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
1d770 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
1d780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1d790 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d7a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1d7b0 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
1d7c0 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
1d7d0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1d7e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d7f0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
1d800 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
1d810 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
1d820 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
1d830 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
1d840 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
1d850 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
1d860 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
1d870 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
1d880 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
1d890 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
1d8a0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1d8b0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1d8c0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1d8d0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1d8e0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1d8f0 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
1d900 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
1d910 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1d920 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1d930 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d940 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1d950 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
1d960 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
1d970 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
1d980 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
1d990 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
1d9a0 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
1d9b0 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
1d9c0 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
1d9d0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1d9e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d9f0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
1da00 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1da10 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  , F_WRLCK, ofst+
1da20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
1da30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1da40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1da50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1da60 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
1da70 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
1da80 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
1da90 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
1daa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1dab0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1dac0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1dad0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1dae0 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
1daf0 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78   pid-%d got %03x
1db00 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
1db10 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70       p->id, getp
1db20 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d  id(), p->sharedM
1db30 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
1db40 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
1db50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1db60 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
1db70 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
1db80 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
1db90 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
1dba0 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
1dbb0 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
1dbc0 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
1dbd0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
1dbe0 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
1dbf0 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
1dc00 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
1dc10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1dc20 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20  nixShmBarrier(. 
1dc30 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1dc40 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
1dc50 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1dc60 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1dc70 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
1dc80 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1dc90 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78  ETER(fd);.  unix
1dca0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1dcb0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1dcc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1dcd0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
1dce0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
1dcf0 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
1dd00 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
1dd10 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
1dd20 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
1dd30 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
1dd40 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
1dd50 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1dd60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e   connection then
1dd70 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
1dd80 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
1dd90 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1dda0 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  int unixShmUnmap
1ddb0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1ddc0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
1ddd0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
1dde0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
1ddf0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ile */.  int del
1de00 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
1de10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
1de20 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  te shared-memory
1de30 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
1de40 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20   unixShm *p;    
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1de70 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
1de80 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
1de90 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
1dea0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
1deb0 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
1dec0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
1ded0 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  nixShm **pp;    
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1def0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1df00 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
1df10 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78  ctions */.  unix
1df20 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
1df30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1df40 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
1df50 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
1df60 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46    pDbFd = (unixF
1df70 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
1df80 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
1df90 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1dfa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
1dfb0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
1dfc0 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ode;..  assert( 
1dfd0 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
1dfe0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1dff0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1e000 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
1e010 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
1e020 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  ;..  /* Remove c
1e030 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d  onnection p from
1e040 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e   the set of conn
1e050 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  ections associat
1e060 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68  ed.  ** with pSh
1e070 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mNode */.  sqlit
1e080 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1e090 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1e0a0 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e  .  for(pp=&pShmN
1e0b0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ode->pFirst; (*p
1e0c0 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
1e0d0 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
1e0e0 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
1e0f0 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
1e100 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
1e110 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1e120 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
1e130 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
1e140 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1e150 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  de->mutex);..  /
1e160 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  * If pShmNode->n
1e170 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20  Ref has reached 
1e180 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  0, then close th
1e190 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a  e underlying.  *
1e1a0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1e1b0 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75  file, too */.  u
1e1c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1e1d0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
1e1e0 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
1e1f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d   pShmNode->nRef-
1e200 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  -;.  if( pShmNod
1e210 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
1e220 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
1e230 20 29 20 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f   ) unlink(pShmNo
1e240 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
1e250 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
1e260 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
1e270 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1e280 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1e290 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
1e2a0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
1e2b0 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
1e2c0 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
1e2d0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
1e2e0 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
1e2f0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
1e300 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
1e310 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
1e320 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
1e330 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
1e340 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1e350 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
1e360 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
1e370 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1e380 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
1e390 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
1e3a0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1e3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e3c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1e3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1e410 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
1e420 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
1e430 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
1e440 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1e450 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
1e460 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
1e470 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
1e480 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
1e490 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
1e4a0 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
1e4b0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
1e4c0 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
1e4d0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1e4e0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
1e4f0 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
1e500 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1e510 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
1e520 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
1e530 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
1e540 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
1e550 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
1e560 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
1e570 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
1e580 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
1e590 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
1e5a0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
1e5b0 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
1e5c0 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
1e5d0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
1e5e0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
1e5f0 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
1e600 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
1e610 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
1e620 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
1e630 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
1e640 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
1e650 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
1e660 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
1e670 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
1e680 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
1e690 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
1e6a0 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
1e6b0 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
1e6c0 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a  ntion F, two obj
1e6d0 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
1e6e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54  :.**.**    (1) T
1e6f0 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66  he real finder-f
1e700 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46  unction named "F
1e710 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20  Impt()"..**.**  
1e720 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74    (2) A constant
1e730 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1e740 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
1e750 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a  just "F"..**.**.
1e760 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
1e770 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73  the F pointer is
1e780 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70   used as the pAp
1e790 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20  pData value for 
1e7a0 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20  VFS.** objects. 
1e7b0 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74   We have to do t
1e7c0 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c  his instead of l
1e7d0 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20  etting pAppData 
1e7e0 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c  point.** directl
1e7f0 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d  y at the finder-
1e800 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43  function since C
1e810 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74  90 rules prevent
1e820 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d   a void*.** from
1e830 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20   be cast into a 
1e840 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
1e850 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ..**.**.** Each 
1e860 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1e870 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73   macro generates
1e880 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a   two objects:.**
1e890 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74  .**   *  A const
1e8a0 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  ant sqlite3_io_m
1e8b0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61  ethods object ca
1e8c0 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68  ll METHOD that h
1e8d0 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20  as locking.**   
1e8e0 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45     methods CLOSE
1e8f0 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
1e900 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  CKRESLOCK..**.**
1e910 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74     *  An I/O met
1e920 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
1e930 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45  ion called FINDE
1e940 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  R that returns a
1e950 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20   pointer.**     
1e960 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f   to the METHOD o
1e970 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65  bject in the pre
1e980 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f  vious bullet..*/
1e990 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f  .#define IOMETHO
1e9a0 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f  DS(FINDER, METHO
1e9b0 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53  D, VERSION, CLOS
1e9c0 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
1e9d0 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a   CKLOCK)      \.
1e9e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1e9f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1ea00 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20  METHOD = {      
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1ea30 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20    VERSION,      
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea50 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1ea80 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20   CLOSE,         
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eaa0 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  xClose */       
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eac0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1ead0 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20  unixRead,       
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1eaf0 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20  Read */         
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1eb20 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20  nixWrite,       
1eb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
1eb40 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  rite */         
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1eb70 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  ixTruncate,     
1eb80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
1eb90 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20  uncate */       
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1ebc0 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  xSync,          
1ebd0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
1ebe0 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  c */            
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1ec10 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
1ec20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1ec30 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c        \.   LOCK,
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1ec80 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b       \.   UNLOCK
1ecb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ecc0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1ecd0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c      \.   CKLOCK,
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1ed20 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20  servedLock */   
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
1ed50 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
1ed60 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1ed70 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  rol */          
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f    \.   unixSecto
1eda0 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
1edb0 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
1edc0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65   \.   unixDevice
1edf0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c  Characteristics,
1ee00 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61    /* xDeviceCapa
1ee10 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20  bilities */     
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c  \.   unixShmMap,
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20   /* xShmMap */  
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ee80 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c  .   unixShmLock,
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20  /* xShmLock */  
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1eed0 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65     unixShmBarrie
1eee0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
1eef0 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1ef20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20    unixShmUnmap  
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ef40 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20   xShmUnmap */   
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b              \.};
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
1efc0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1efd0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49  3_io_methods *FI
1efe0 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74  NDER##Impl(const
1eff0 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69   char *z, unixFi
1f000 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e  le *p){   \.  UN
1f010 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a  USED_PARAMETER(z
1f020 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ); UNUSED_PARAME
1f030 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20  TER(p);         
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f050 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74           \.  ret
1f060 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20  urn &METHOD;    
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20          \.}     
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
1f100 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1f110 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73  _methods *(*cons
1f120 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20  t FINDER)(const 
1f130 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a  char*,unixFile *
1f140 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49  p)    \.    = FI
1f150 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a  NDER##Impl;../*.
1f160 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20  ** Here are all 
1f170 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
1f180 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1f190 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  s for each of th
1f1a0 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72  e.** locking str
1f1b0 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69  ategies.  Functi
1f1c0 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20  ons that return 
1f1d0 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73  pointers to thes
1f1e0 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65  e methods.** are
1f1f0 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a   also created..*
1f200 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70  /.IOMETHODS(.  p
1f210 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20  osixIoFinder,   
1f220 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
1f230 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
1f240 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74   */.  posixIoMet
1f250 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
1f260 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
1f270 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
1f280 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20  e */.  2,       
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
1f2b0 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  y is enabled */.
1f2c0 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f2e0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1f2f0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
1f300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f310 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
1f320 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20   unixUnlock,    
1f330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1f340 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1f350 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
1f360 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78  vedLock     /* x
1f370 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1f380 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  k method */.).IO
1f390 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63  METHODS(.  noloc
1f3a0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
1f3b0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1f3c0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1f3d0 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    nolockIoMethod
1f3e0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  s,          /* s
1f3f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1f400 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
1f410 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f430 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
1f440 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e   disabled */.  n
1f450 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  olockClose,     
1f460 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1f470 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  se method */.  n
1f480 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  olockLock,      
1f490 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1f4a0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
1f4b0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
1f4c0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1f4d0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
1f4e0 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
1f4f0 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65  edLock   /* xChe
1f500 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
1f510 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
1f520 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49  HODS(.  dotlockI
1f530 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
1f540 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
1f550 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  tion name */.  d
1f560 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  otlockIoMethods,
1f570 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
1f580 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1f590 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
1f5a0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1f5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
1f5c0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
1f5d0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c  sabled */.  dotl
1f5e0 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
1f5f0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1f600 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
1f610 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
1f620 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1f630 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
1f640 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
1f650 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1f660 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
1f670 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
1f680 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52  Lock  /* xCheckR
1f690 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1f6a0 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c  od */.)..#if SQL
1f6b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1f6c0 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
1f6d0 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
1f6e0 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64  S(.  flockIoFind
1f6f0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
1f700 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
1f710 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63  n name */.  floc
1f720 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
1f730 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1f740 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1f750 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f770 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
1f780 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
1f790 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c  led */.  flockCl
1f7a0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1f7b0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1f7c0 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f  hod */.  flockLo
1f7d0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1f7e0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1f7f0 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c  od */.  flockUnl
1f800 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1f810 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1f820 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68  hod */.  flockCh
1f830 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1f840 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1f850 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1f860 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
1f870 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45   OS_VXWORKS.IOME
1f880 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69  THODS(.  semIoFi
1f890 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
1f8a0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
1f8b0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1f8c0 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  semIoMethods,   
1f8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1f8e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1f8f0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1f900 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
1f910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
1f920 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
1f930 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d  isabled */.  sem
1f940 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1f950 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1f960 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
1f970 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1f980 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1f990 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55  method */.  semU
1f9a0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
1f9b0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1f9c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
1f9d0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1f9e0 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
1f9f0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
1fa00 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
1fa10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1fa20 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
1fa30 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1fa40 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
1fa50 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c  (.  afpIoFinder,
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fa70 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1fa80 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f   name */.  afpIo
1fa90 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
1faa0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1fab0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1fac0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fae0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
1faf0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
1fb00 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65  ed */.  afpClose
1fb10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fb20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
1fb30 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c  od */.  afpLock,
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
1fb60 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b  d */.  afpUnlock
1fb70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fb80 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
1fb90 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b  od */.  afpCheck
1fba0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
1fbb0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1fbc0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
1fbd0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.).#endif../*.*
1fbe0 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
1fbf0 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20  ing method is a 
1fc00 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69  "super-method" i
1fc10 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  n the sense that
1fc20 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63   it.** opens sec
1fc30 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63  ondary file desc
1fc40 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20  riptors for the 
1fc50 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66  conch and lock f
1fc60 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75  iles and.** it u
1fc70 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66  ses proxy, dot-f
1fc80 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c  ile, AFP, and fl
1fc90 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65  ock() locking me
1fca0 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a  thods on those.*
1fcb0 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  * secondary file
1fcc0 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  s.  For this rea
1fcd0 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
1fce0 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
1fcf0 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s.** proxy locki
1fd00 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75  ng is located mu
1fd10 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20  ch further down 
1fd20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75  in the file.  Bu
1fd30 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  t we need.** to 
1fd40 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66  go ahead and def
1fd50 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ine the sqlite3_
1fd60 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66  io_methods and f
1fd70 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a  inder function.*
1fd80 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  * for proxy lock
1fd90 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65  ing here.  So we
1fda0 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65   forward declare
1fdb0 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
1fdc0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
1fdd0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1fde0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1fdf0 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69  KING_STYLE.stati
1fe00 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
1fe10 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  (sqlite3_file*);
1fe20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
1fe30 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  yLock(sqlite3_fi
1fe40 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
1fe50 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63  c int proxyUnloc
1fe60 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
1fe70 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
1fe80 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
1fe90 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
1fea0 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49  _file*, int*);.I
1feb0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78  OMETHODS(.  prox
1fec0 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  yIoFinder,      
1fed0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1fee0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1fef0 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  .  proxyIoMethod
1ff00 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
1ff10 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1ff20 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1ff30 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff50 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
1ff60 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
1ff70 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20  proxyClose,     
1ff80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1ff90 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
1ffa0 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20  proxyLock,      
1ffb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1ffc0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
1ffd0 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  roxyUnlock,     
1ffe0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1fff0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
20000 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
20010 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68  edLock    /* xCh
20020 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
20030 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
20040 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64  if../* nfs lockd
20050 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f   on OSX 10.3+ do
20060 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74  esn't clear writ
20070 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72  e locks when a r
20080 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20  ead lock is set 
20090 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
200a0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
200b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
200c0 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
200d0 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65  DS(.  nfsIoFinde
200e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
200f0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
20100 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66  ion name */.  nf
20110 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  sIoMethods,     
20120 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
20130 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
20140 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
20150 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
20160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
20170 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
20180 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  isabled */.  uni
20190 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
201a0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
201b0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
201c0 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
201d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
201e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66  k method */.  nf
201f0 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  sUnlock,        
20200 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
20210 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
20220 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
20230 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
20240 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
20250 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
20260 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
20270 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
20280 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
20290 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a  KING_STYLE./* .*
202a0 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
202b0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
202c0 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  s to determine t
202d0 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20  he best locking 
202e0 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72  strategy .** for
202f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20300 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20  le "filePath".  
20310 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  It then returns 
20320 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
20330 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
20340 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
20350 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
20360 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f  **.** This is fo
20370 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a  r MacOSX only..*
20380 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
20390 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
203a0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
203b0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
203c0 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
203d0 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
203e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
203f0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
20400 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
20410 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  * open file obje
20420 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ct for the datab
20430 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ase file */.){. 
20440 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
20450 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20  ruct Mapping {. 
20460 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
20470 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20  Filesystem;     
20480 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
20490 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65  system type name
204a0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71   */.    const sq
204b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
204c0 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a   *pMethods;   /*
204d0 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   Appropriate loc
204e0 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  king method */. 
204f0 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20   } aMap[] = {.  
20500 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70    { "hfs",    &p
20510 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
20520 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20  .    { "ufs",   
20530 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
20540 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73   },.    { "afpfs
20550 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
20560 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66  s },.    { "smbf
20570 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
20580 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62  ds },.    { "web
20590 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  dav", &nolockIoM
205a0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
205b0 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0, 0 }.  };.  in
205c0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
205d0 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73  atfs fsInfo;.  s
205e0 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
205f0 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
20600 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
20610 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
20620 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
20630 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
20640 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
20650 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
20660 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
20670 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
20680 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
20690 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20  IoMethods;.  }. 
206a0 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65   if( statfs(file
206b0 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
206c0 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  = -1 ){.    if( 
206d0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
206e0 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20   MNT_RDONLY ){. 
206f0 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c       return &nol
20700 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
20710 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
20720 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
20730 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  stem; i++){.    
20740 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
20750 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
20760 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  , aMap[i].zFiles
20770 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  ystem)==0 ){.   
20780 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70       return aMap
20790 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20  [i].pMethods;.  
207a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
207b0 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61  .  /* Default ca
207c0 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f  se. Handles, amo
207d0 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66  ngst others, "nf
207e0 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79  s"..  ** Test by
207f0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73  te-range lock us
20800 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20  ing fcntl(). If 
20810 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64  the call succeed
20820 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  s, .  ** assume 
20830 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79  that the file-sy
20840 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f  stem supports PO
20850 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
20860 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66   .  */.  lockInf
20870 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
20880 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
20890 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
208a0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
208b0 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
208c0 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
208d0 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 70 4e  ;.  if( fcntl(pN
208e0 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
208f0 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
20900 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
20910 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
20920 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
20930 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20940 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
20950 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
20960 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
20970 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
20980 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
20990 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
209a0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
209b0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
209c0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
209d0 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
209e0 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
209f0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
20a00 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
20a10 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
20a20 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
20a30 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
20a40 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
20a50 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
20a60 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
20a70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
20a80 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
20a90 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
20aa0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
20ab0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
20ac0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
20ad0 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
20ae0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20af0 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
20b00 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
20b10 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
20b20 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
20b30 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
20b40 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
20b50 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
20b60 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
20b70 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
20b80 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
20b90 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
20ba0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
20bb0 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
20bc0 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
20bd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20be0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
20bf0 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
20c00 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
20c10 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
20c20 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
20c30 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
20c40 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
20c50 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
20c60 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
20c70 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
20c80 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
20c90 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
20ca0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
20cb0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
20cc0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
20cd0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
20ce0 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
20cf0 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
20d00 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
20d10 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
20d20 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
20d30 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
20d40 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
20d50 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
20d60 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
20d70 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
20d80 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
20d90 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
20da0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
20db0 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
20dc0 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c  LCK;.  if( fcntl
20dd0 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
20de0 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
20df0 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
20e00 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
20e10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
20e20 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68  eturn &semIoMeth
20e30 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
20e40 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
20e50 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
20e60 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
20e70 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
20e80 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
20e90 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
20ea0 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
20eb0 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  /* OS_VXWORKS &&
20ec0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
20ed0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
20ee0 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
20ef0 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
20f00 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65  inter to a IO me
20f10 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
20f20 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66  tion:.*/.typedef
20f30 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
20f40 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e  o_methods *(*fin
20f50 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20  der_type)(const 
20f60 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
20f70 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.../***********
20f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fc0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
20fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
20fe0 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
20ff0 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
21000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
21010 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
21020 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
21030 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
21040 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
21050 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
21060 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
21070 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
21080 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
21090 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
210a0 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
210b0 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69  by pId..*/.stati
210c0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78  c int fillInUnix
210d0 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  File(.  sqlite3_
210e0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
210f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
21100 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  s object */.  in
21110 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
21120 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
21130 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
21140 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
21150 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  ed */.  int dirf
21160 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
21170 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c  /* Directory fil
21180 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
21190 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
211a0 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69  pId,      /* Wri
211b0 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69  te to the unixFi
211c0 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72  le structure her
211d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
211e0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
211f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
21200 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
21210 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c  */.  int noLock,
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21230 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20  Omit locking if 
21240 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  true */.  int is
21250 44 65 6c 65 74 65 20 20 20 20 20 20 20 20 20 20  Delete          
21260 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
21270 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  lose if true */.
21280 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  ){.  const sqlit
21290 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
212a0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
212b0 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d  unixFile *pNew =
212c0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64   (unixFile *)pId
212d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
212e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
212f0 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d  t( pNew->pInode=
21300 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50  =NULL );..  /* P
21310 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74  arameter isDelet
21320 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f  e is only used o
21330 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72 65  n vxworks. Expre
21340 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69 74  ss this explicit
21350 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f  ly .  ** here to
21360 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65   prevent compile
21370 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74  r warnings about
21380 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65   unused paramete
21390 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  rs..  */.  UNUSE
213a0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65  D_PARAMETER(isDe
213b0 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55 73 75  lete);..  /* Usu
213c0 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46  ally the path zF
213d0 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  ilename should n
213e0 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65  ot be a relative
213f0 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20   pathname. The. 
21400 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73   ** exception is
21410 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
21420 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20  e proxy "conch" 
21430 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74  file in builds t
21440 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65  hat.  ** include
21450 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70 70   the special App
21460 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  le locking style
21470 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  s..  */.#if defi
21480 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
21490 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
214a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
214b0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
214c0 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
214d0 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c  e[0]=='/' .    |
214e0 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  | pVfs->pAppData
214f0 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  ==(void*)&autolo
21500 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65  ckIoFinder );.#e
21510 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46  lse.  assert( zF
21520 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
21530 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
21540 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54  );.#endif..  OST
21550 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25  RACE(("OPEN    %
21560 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46  -3d %s\n", h, zF
21570 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65  ilename));.  pNe
21580 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
21590 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b  ->dirfd = dirfd;
215a0 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46 6c 61  .  pNew->fileFla
215b0 67 73 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  gs = 0;.  pNew->
215c0 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  zPath = zFilenam
215d0 65 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  e;..#if OS_VXWOR
215e0 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d  KS.  pNew->pId =
215f0 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65   vxworksFindFile
21600 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  Id(zFilename);. 
21610 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d   if( pNew->pId==
21620 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20  0 ){.    noLock 
21630 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
21640 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
21650 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f  #endif..  if( no
21660 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
21670 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c  kingStyle = &nol
21680 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
21690 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
216a0 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66  ingStyle = (**(f
216b0 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73  inder_type*)pVfs
216c0 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c  ->pAppData)(zFil
216d0 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69  ename, pNew);.#i
216e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
216f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
21700 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65    /* Cache zFile
21710 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b  name in the lock
21720 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50  ing context (AFP
21730 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65   and dotlock ove
21740 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a  rride) for.    *
21750 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69  * proxyLock acti
21760 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  vation is possib
21770 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79  le (remote proxy
21780 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20   is based on db 
21790 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69  name).    ** zFi
217a0 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76  lename remains v
217b0 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20  alid until file 
217c0 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75  is closed, to su
217d0 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65  pport */.    pNe
217e0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
217f0 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65  t = (void*)zFile
21800 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  name;.#endif.  }
21810 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  ..  if( pLocking
21820 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49  Style == &posixI
21830 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66  oMethods.#if def
21840 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
21850 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
21860 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
21870 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
21880 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74  yle == &nfsIoMet
21890 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b  hods.#endif.  ){
218a0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
218b0 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
218c0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
218d0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
218e0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
218f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21900 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
21910 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e  r occured in fin
21920 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c  dInodeInfo(), cl
21930 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
21940 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a  criptor.      **
21950 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65   immediately, be
21960 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74  fore releasing t
21970 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e  he mutex. findIn
21980 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61  odeInfo() may fa
21990 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  il.      ** in t
219a0 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20  wo scenarios:.  
219b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
219c0 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20    (a) A call to 
219d0 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a  fstat() failed..
219e0 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41        **   (b) A
219f0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a   malloc failed..
21a00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21a10 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d  * Scenario (b) m
21a20 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  ay only occur if
21a30 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20   the process is 
21a40 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72  holding no other
21a50 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64  .      ** file d
21a60 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20  escriptors open 
21a70 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
21a80 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  . If there were 
21a90 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20  other file.     
21aa0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20   ** descriptors 
21ab0 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  on this file, th
21ac0 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75  en no malloc wou
21ad0 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62  ld be required b
21ae0 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49  y.      ** findI
21af0 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74  nodeInfo(). If t
21b00 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
21b10 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66   it is quite saf
21b20 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20  e to close.     
21b30 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61   ** handle h - a
21b40 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  s it is guarante
21b50 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78  ed that no posix
21b60 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72   locks will be r
21b70 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a  eleased.      **
21b80 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20   by doing so..  
21b90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21ba0 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20  If scenario (a) 
21bb0 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72  caused the error
21bc0 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65   then things are
21bd0 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68   not so safe. Th
21be0 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69  e.      ** impli
21bf0 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68  cit assumption h
21c00 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66  ere is that if f
21c10 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68  stat() fails, th
21c20 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20  ings are in.    
21c30 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68    ** such bad sh
21c40 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e  ape that droppin
21c50 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20  g a lock or two 
21c60 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d  doesn't matter m
21c70 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  uch..      */.  
21c80 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
21c90 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
21ca0 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
21cb0 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66  utex();.  }..#if
21cc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
21cd0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
21ce0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
21cf0 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  _).  else if( pL
21d00 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
21d10 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
21d20 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69      /* AFP locki
21d30 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
21d40 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
21d50 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
21d60 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61   in.    ** the a
21d70 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
21d80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70  ..    */.    afp
21d90 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
21da0 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pCtx;.    pNew->
21db0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
21dc0 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
21dd0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
21de0 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28  pCtx) );.    if(
21df0 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pCtx==0 ){.    
21e00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
21e10 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
21e20 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
21e30 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
21e40 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
21e50 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
21e60 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
21e70 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
21e80 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
21e90 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
21ea0 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
21eb0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
21ec0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
21ed0 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
21ee0 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
21ef0 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
21f00 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
21f10 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
21f20 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
21f30 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
21f40 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
21f50 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
21f60 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  node);.      if(
21f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21f80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21f90 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
21fa0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
21fb0 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
21fc0 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a          h = -1;.
21fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e        }.      un
21fe0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
21ff0 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
22000 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65  }.#endif..  else
22010 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
22020 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
22030 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
22040 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
22050 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
22060 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
22070 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
22080 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
22090 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
220a0 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
220b0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
220c0 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
220d0 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d  me;.    nFilenam
220e0 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
220f0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
22100 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
22110 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
22120 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  malloc(nFilename
22130 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
22140 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
22150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22160 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
22170 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
22180 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
22190 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
221a0 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
221b0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
221c0 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
221d0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
221e0 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
221f0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
22200 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
22210 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
22220 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
22230 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
22240 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
22250 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
22260 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
22270 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
22280 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
22290 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
222a0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
222b0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
222c0 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
222d0 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
222e0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
222f0 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
22300 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d  w->pInode->pSem=
22310 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
22320 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
22330 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
22340 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
22350 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
22360 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
22370 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
22380 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
223b0 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
223c0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
223d0 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
223e0 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
223f0 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
22400 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
22410 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
22420 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
22430 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d   = sem_open(zSem
22440 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30  Name, O_CREAT, 0
22450 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  666, 1);.      i
22460 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  f( pNew->pInode-
22470 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
22480 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
22490 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
224a0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
224b0 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
224c0 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
224d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
224e0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
224f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
22500 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  pNew->lastErrno 
22510 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  = 0;.#if OS_VXWO
22520 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
22530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
22540 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28  f( h>=0 ) close(
22550 68 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  h);.    h = -1;.
22560 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65      unlink(zFile
22570 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c  name);.    isDel
22580 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ete = 0;.  }.  p
22590 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20  New->isDelete = 
225a0 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66  isDelete;.#endif
225b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
225c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
225d0 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
225e0 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65  (dirfd); /* sile
225f0 6e 74 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c  nt leak if fail,
22600 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f   already in erro
22610 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 3e 3d  r */.    if( h>=
22620 30 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20  0 ) close(h);.  
22630 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
22640 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b  >pMethod = pLock
22650 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70  ingStyle;.    Op
22660 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
22670 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22680 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
22690 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
226a0 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
226b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
226c0 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
226d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
226e0 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
226f0 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
22700 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
22710 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
22720 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
22730 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
22740 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
22750 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
22760 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
22770 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
22780 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
22790 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
227a0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
227b0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
227c0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
227d0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
227e0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
227f0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
22800 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
22810 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
22820 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
22830 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
22840 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
22850 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
22860 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
22870 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
22880 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
22890 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
228a0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
228b0 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
228c0 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
228d0 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
228e0 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d   ii>1 && zDirnam
228f0 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
22900 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
22910 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
22920 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64  ] = '\0';.    fd
22930 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65   = open(zDirname
22940 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
22950 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ARY, 0);.    if(
22960 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66   fd>=0 ){.#ifdef
22970 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20   FD_CLOEXEC.    
22980 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45    fcntl(fd, F_SE
22990 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46  TFD, fcntl(fd, F
229a0 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
229b0 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
229c0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
229d0 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
229e0 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
229f0 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e));.    }.  }. 
22a00 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65   *pFd = fd;.  re
22a10 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49  turn (fd>=0?SQLI
22a20 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e  TE_OK:SQLITE_CAN
22a30 54 4f 50 45 4e 5f 42 4b 50 54 29 3b 0a 7d 0a 0a  TOPEN_BKPT);.}..
22a40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22a50 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63   name of a direc
22a60 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  tory in which to
22a70 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66   put temporary f
22a80 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73  iles..** If no s
22a90 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72  uitable temporar
22aa0 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79  y file directory
22ab0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
22ac0 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
22ad0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
22ae0 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69   *unixTempFileDi
22af0 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  r(void){.  stati
22b00 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
22b10 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
22b20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
22b30 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
22b40 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
22b50 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30    "/tmp",.     0
22b60 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
22b70 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20  terminator */.  
22b80 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  };.  unsigned in
22b90 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
22ba0 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
22bb0 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
22bc0 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73  .  azDirs[0] = s
22bd0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
22be0 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a  ctory;.  if( !az
22bf0 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
22c00 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
22c10 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d  PDIR");.  for(i=
22c20 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
22c30 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
22c40 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69  s[0]); zDir=azDi
22c50 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66  rs[i++]){.    if
22c60 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74  ( zDir==0 ) cont
22c70 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74  inue;.    if( st
22c80 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29  at(zDir, &buf) )
22c90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
22ca0 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
22cb0 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
22cc0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63  nue;.    if( acc
22cd0 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20  ess(zDir, 07) ) 
22ce0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72  continue;.    br
22cf0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
22d00 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zDir;.}../*.**
22d10 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
22d20 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
22d30 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
22d40 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
22d50 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
22d60 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
22d70 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
22d80 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
22d90 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
22da0 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
22db0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
22dc0 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
22dd0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
22de0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
22df0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
22e00 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
22e10 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
22e20 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
22e30 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
22e40 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
22e50 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75  0123456789";.  u
22e60 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a  nsigned int i, j
22e70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
22e80 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zDir;..  /* It's
22e90 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
22ea0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
22eb0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
22ec0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
22ed0 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
22ee0 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
22ef0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
22f00 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
22f10 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
22f20 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
22f30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
22f40 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
22f50 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69  _IOERR );..  zDi
22f60 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
22f70 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69  Dir();.  if( zDi
22f80 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e  r==0 ) zDir = ".
22f90 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  ";..  /* Check t
22fa0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
22fb0 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
22fc0 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
22fd0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
22fe0 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
22ff0 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
23000 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
23010 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
23020 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
23030 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
23040 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20  REFIX) + 17) >= 
23050 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a  (size_t)nBuf ){.
23060 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23070 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
23080 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
23090 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37  snprintf(nBuf-17
230a0 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
230b0 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
230c0 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
230d0 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   j = (int)strlen
230e0 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
230f0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
23100 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
23110 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
23120 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
23130 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
23140 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
23150 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
23160 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
23170 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
23180 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
23190 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73    }while( access
231a0 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
231b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
231c0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
231d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
231e0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
231f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
23200 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
23210 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
23220 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
23230 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
23240 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
23250 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
23260 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
23270 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
23280 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
23290 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
232a0 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
232b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
232c0 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
232d0 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
232e0 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
232f0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
23300 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
23310 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
23320 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
23330 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
23340 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
23350 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
23360 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
23370 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
23380 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
23390 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
233a0 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
233b0 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
233c0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
233d0 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
233e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
233f0 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
23400 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
23410 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
23420 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
23430 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
23440 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
23450 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
23460 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
23470 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
23480 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
23490 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
234a0 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
234b0 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
234c0 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
234d0 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
234e0 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
234f0 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
23500 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
23510 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
23520 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
23530 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
23540 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
23550 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
23560 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
23570 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
23580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
23590 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
235a0 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
235b0 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
235c0 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
235d0 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
235e0 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
235f0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
23600 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
23610 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
23620 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
23630 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
23640 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
23650 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
23660 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
23670 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
23680 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
23690 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
236a0 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
236b0 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
236c0 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
236d0 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
236e0 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
236f0 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
23700 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
23710 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
23720 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
23730 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
23740 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
23750 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
23760 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
23770 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
23780 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
23790 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
237a0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
237b0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
237c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
237d0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
237e0 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
237f0 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
23800 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
23810 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
23820 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
23830 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
23840 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
23850 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
23860 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
23870 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
23880 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
23890 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
238a0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
238b0 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
238c0 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
238d0 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
238e0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
238f0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
23900 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
23910 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
23920 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
23930 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
23940 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
23950 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
23960 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
23970 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
23980 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
23990 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
239a0 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
239b0 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
239c0 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64  resusable file d
239d0 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f  escriptor are no
239e0 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66  t dire.  */.  if
239f0 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c  ( 0==stat(zPath,
23a00 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
23a10 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
23a20 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78  Inode;..    unix
23a30 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
23a40 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
23a50 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
23a60 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
23a70 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
23a80 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23aa0 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
23ab0 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
23ac0 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
23ad0 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
23ae0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
23af0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
23b00 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
23b10 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
23b20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
23b30 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
23b40 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
23b50 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
23b60 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
23b70 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
23b80 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
23b90 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
23ba0 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
23bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23bc0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
23bd0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
23be0 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
23bf0 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
23c00 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
23c10 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23c20 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75  n is called by u
23c30 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74  nixOpen() to det
23c40 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20  ermine the unix 
23c50 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74  permissions.** t
23c60 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c  o create new fil
23c70 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65  es with. If no e
23c80 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
23c90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
23ca0 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
23cb0 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20   value suitable 
23cc0 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74  for passing as t
23cd0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
23ce0 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a  t to open(2) is.
23cf0 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
23d00 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65  Mode. If an IO e
23d10 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
23d20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
23d30 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
23d40 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
23d50 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74  of *pMode is not
23d60 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
23d70 20 49 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   If the file bei
23d80 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74  ng opened is a t
23d90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69  emporary file, i
23da0 74 20 69 73 20 61 6c 77 61 79 73 20 63 72 65 61  t is always crea
23db0 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
23dc0 6f 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e  octal permission
23dd0 73 20 30 36 30 30 20 28 72 65 61 64 2f 77 72 69  s 0600 (read/wri
23de0 74 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f  table by owner o
23df0 6e 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c  nly). If the fil
23e00 65 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61  e.** is a databa
23e10 73 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75  se or master jou
23e20 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73  rnal file, it is
23e30 20 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68   created with th
23e40 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
23e50 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45  * mask SQLITE_DE
23e60 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
23e70 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69  SSIONS..**.** Fi
23e80 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69  nally, if the fi
23e90 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
23ea0 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
23eb0 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
23ec0 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
23ed0 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
23ee0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
23ef0 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
23f00 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
23f10 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
23f20 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
23f30 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
23f40 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
23f50 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
23f60 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
23f70 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
23f80 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
23f90 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
23fa0 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
23fb0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
23fc0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
23fd0 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65  t findCreateFile
23fe0 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  Mode(.  const ch
23ff0 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
24000 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
24010 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c  of file (possibl
24020 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65 64  y) being created
24030 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24050 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
24060 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72 67  assed as 4th arg
24070 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29  ument to xOpen()
24080 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d   */.  mode_t *pM
24090 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
240a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65        /* OUT: Pe
240b0 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65  rmissions to ope
240c0 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 29  n file with */.)
240d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
240e0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
240f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
24100 64 65 20 2a 2f 0a 20 20 69 66 28 20 66 6c 61 67  de */.  if( flag
24110 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
24120 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  _WAL|SQLITE_OPEN
24130 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29  _MAIN_JOURNAL) )
24140 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d  {.    char zDb[M
24150 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20  AX_PATHNAME+1]; 
24160 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24170 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20  file path */.   
24180 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20   int nDb;       
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
241a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
241b0 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a  d bytes in zDb *
241c0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
241d0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
241e0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66      /* Output of
241f0 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62   stat() on datab
24200 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
24210 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70   /* zPath is a p
24220 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20  ath to a WAL or 
24230 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
24240 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
24250 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a  k derives.    **
24260 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
24270 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
24280 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a  base file from z
24290 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b  Path. This block
242a0 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20   handles.    ** 
242b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61  the following na
242c0 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  ming conventions
242d0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
242e0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
242f0 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20  journal".    ** 
24300 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
24310 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  wal".    **   "<
24320 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
24330 6e 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a 2a  nal-NNNN".    **
24340 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
24350 2d 77 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a  -wal-NNNN".    *
24360 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
24370 4e 4e 4e 20 69 73 20 61 20 34 20 64 69 67 69 74  NNN is a 4 digit
24380 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e   decimal number.
24390 20 54 68 65 20 4e 4e 4e 4e 20 6e 61 6d 69 6e 67   The NNNN naming
243a0 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
243b0 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
243c0 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
243d0 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
243e0 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
243f0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
24400 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c  ) - 1; .    whil
24410 65 28 20 6e 44 62 3e 30 20 26 26 20 7a 50 61 74  e( nDb>0 && zPat
24420 68 5b 6e 44 62 5d 21 3d 27 6c 27 20 29 20 6e 44  h[nDb]!='l' ) nD
24430 62 2d 2d 3b 0a 20 20 20 20 6e 44 62 20 2d 3d 20  b--;.    nDb -= 
24440 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
24450 5f 4f 50 45 4e 5f 57 41 4c 29 20 3f 20 33 20 3a  _OPEN_WAL) ? 3 :
24460 20 37 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   7);.    memcpy(
24470 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29  zDb, zPath, nDb)
24480 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d  ;.    zDb[nDb] =
24490 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20   '\0';..    if( 
244a0 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26 73 53  0==stat(zDb, &sS
244b0 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  tat) ){.      *p
244c0 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
244d0 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
244e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
244f0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
24500 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
24510 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
24520 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
24530 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
24540 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
24550 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
24560 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
24570 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
24580 53 53 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 72 65  SSIONS;.  }.  re
24590 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
245a0 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
245b0 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
245c0 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
245d0 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
245e0 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
245f0 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
24600 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
24610 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
24620 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
24630 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
24640 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
24650 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
24660 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
24670 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
24680 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
24690 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
246a0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
246b0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
246c0 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
246d0 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
246e0 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
246f0 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
24700 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
24710 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
24720 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
24730 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
24740 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
24750 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
24760 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
24770 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
24780 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
24790 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
247a0 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
247b0 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
247c0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
247d0 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
247e0 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
247f0 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
24800 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
24810 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
24820 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
24830 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
24840 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
24850 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
24860 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
24870 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
24880 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
24890 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
248a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
248b0 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63  The VFS for whic
248c0 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f  h this is the xO
248d0 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  pen method */.  
248e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
248f0 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h,           /* 
24900 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
24910 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
24920 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
24930 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
24940 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
24950 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c  riptor to be fil
24960 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  led in */.  int 
24970 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
24980 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
24990 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72  t flags to contr
249a0 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a  ol the opening *
249b0 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
249c0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
249d0 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73   /* Output flags
249e0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
249f0 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20  ite core */.){. 
24a00 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
24a10 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65  unixFile *)pFile
24a20 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a40 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
24a50 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62  iptor returned b
24a60 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  y open() */.  in
24a70 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  t dirfd = -1;   
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a90 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
24aa0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
24ab0 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30  nt openFlags = 0
24ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24ad0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
24ae0 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  o open() */.  in
24af0 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
24b00 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
24b10 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
24b20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  open */.  int no
24b30 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
24b40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
24b50 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
24b60 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
24b70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24b80 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
24b90 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
24ba0 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e  rn Code */..  in
24bb0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
24bc0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
24bd0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
24be0 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
24bf0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
24c00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
24c10 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
24c20 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
24c30 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
24c40 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
24c50 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
24c60 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
24c70 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
24c80 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
24c90 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
24ca0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
24cb0 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
24cc0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
24cd0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
24ce0 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
24cf0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
24d00 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
24d10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
24d20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65  creating a maste
24d30 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a  r or main-file j
24d40 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e  ournal, this fun
24d50 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a  ction will open.
24d60 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63    ** a file-desc
24d70 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69  riptor on the di
24d80 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65  rectory too. The
24d90 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78   first time unix
24da0 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63  Sync().  ** is c
24db0 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74  alled the direct
24dc0 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
24dd0 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e  tor will be fsyn
24de0 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28  c()ed and close(
24df0 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  )d..  */.  int i
24e00 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d  sOpenDirectory =
24e10 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
24e20 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
24e30 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
24e40 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
24e50 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
24e60 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
24e70 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
24e80 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
24e90 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
24ea0 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
24eb0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
24ec0 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
24ed0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
24ee0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
24ef0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
24f00 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
24f10 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
24f20 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
24f30 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
24f40 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20  _PATHNAME+1];.  
24f50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
24f60 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
24f70 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
24f80 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
24f90 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
24fa0 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
24fb0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
24fc0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
24fd0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
24fe0 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
24ff0 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
25000 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
25010 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
25020 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
25030 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
25040 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
25050 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
25060 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
25070 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
25080 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
25090 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
250a0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
250b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
250c0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
250d0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
250e0 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
250f0 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
25100 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
25110 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
25120 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
25130 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
25140 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
25150 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
25160 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
25170 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
25180 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
25190 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
251a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
251b0 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
251c0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
251d0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
251e0 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
251f0 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
25200 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
25210 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
25220 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
25230 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
25240 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
25250 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
25260 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
25270 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
25280 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
25290 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
252a0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
252b0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
252c0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
252d0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
252e0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
252f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
25300 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
25310 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
25320 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
25330 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
25340 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
25350 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
25360 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
25370 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
25380 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
25390 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
253a0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
253b0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
253c0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
253d0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
253e0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
253f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
25400 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
25410 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25420 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
25430 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
25440 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
25450 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
25460 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25470 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
25480 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
25490 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
254a0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
254b0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
254c0 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
254d0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
254e0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
254f0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
25500 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
25510 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
25520 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
25530 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
25540 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
25550 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
25560 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
25570 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
25580 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
25590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
255a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
255b0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75     }.    p->pUnu
255c0 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
255d0 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
255e0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
255f0 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
25600 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
25610 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
25620 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
25630 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
25640 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74  && !isOpenDirect
25650 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  ory);.    rc = u
25660 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d  nixGetTempname(M
25670 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a  AX_PATHNAME+1, z
25680 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
25690 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
256a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
256b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
256c0 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
256d0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
256e0 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
256f0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
25700 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
25710 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
25720 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
25730 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
25740 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
25750 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
25760 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
25770 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
25780 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
25790 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
257a0 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
257b0 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
257c0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
257d0 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
257e0 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
257f0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
25800 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
25810 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
25820 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
25830 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
25840 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
25850 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
25860 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
25870 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
25880 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
25890 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
258a0 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
258b0 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
258c0 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
258d0 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
258e0 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
258f0 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
25900 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
25910 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
25920 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
25930 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
25940 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
25950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25960 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55    assert( !p->pU
25970 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61  nused );.      a
25980 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
25990 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c  LITE_OPEN_WAL ||
259a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
259b0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
259c0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
259d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   rc;.    }.    f
259e0 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  d = open(zName, 
259f0 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
25a00 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ode);.    OSTRAC
25a10 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64  E(("OPENX   %-3d
25a20 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20   %s 0%o\n", fd, 
25a30 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
25a40 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  ));.    if( fd<0
25a50 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49   && errno!=EISDI
25a60 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65  R && isReadWrite
25a70 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
25a80 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   ){.      /* Fai
25a90 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  led to open the 
25aa0 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72  file for read/wr
25ab0 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20  ite access. Try 
25ac0 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  read-only. */.  
25ad0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
25ae0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
25af0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
25b00 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20  _CREATE);.      
25b10 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f  openFlags &= ~(O
25b20 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a  _RDWR|O_CREAT);.
25b30 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
25b40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
25b50 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  NLY;.      openF
25b60 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
25b70 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 6f 70 65  ;.      fd = ope
25b80 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
25b90 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
25ba0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c     }.    if( fd<
25bb0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
25bc0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
25bd0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
25be0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
25bf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
25c00 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
25c10 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
25c20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
25c30 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
25c40 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b  f( p->pUnused ){
25c50 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
25c60 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d  >fd = fd;.    p-
25c70 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20  >pUnused->flags 
25c80 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
25c90 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
25ca0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
25cb0 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
25cc0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69  ;.#else.    unli
25cd0 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nk(zName);.#endi
25ce0 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  f.  }.#if SQLITE
25cf0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
25d00 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20  STYLE.  else{.  
25d10 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d    p->openFlags =
25d20 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
25d30 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73  #endif..  if( is
25d40 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b  OpenDirectory ){
25d50 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
25d60 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
25d70 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
25d80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
25d90 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
25da0 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20 66 64  safe to close fd
25db0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
25dc0 62 65 63 61 75 73 65 20 69 74 20 69 73 20 67 75  because it is gu
25dd0 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a 20 20 20  aranteed not.   
25de0 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 70 65 6e     ** to be open
25df0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66   on a database f
25e00 69 6c 65 2e 20 49 66 20 69 74 20 77 65 72 65 20  ile. If it were 
25e10 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61  open on a databa
25e20 73 65 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 2a  se file,.      *
25e30 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62  * it would not b
25e40 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20  e safe to close 
25e50 61 73 20 74 68 69 73 20 77 6f 75 6c 64 20 72 65  as this would re
25e60 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20  lease any locks 
25e70 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  held.      ** on
25e80 20 74 68 65 20 66 69 6c 65 20 62 79 20 74 68 69   the file by thi
25e90 73 20 70 72 6f 63 65 73 73 2e 20 20 2a 2f 0a 20  s process.  */. 
25ea0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
25eb0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
25ec0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20 20  MAIN_DB );.     
25ed0 20 63 6c 6f 73 65 28 66 64 29 3b 20 20 20 20 20   close(fd);     
25ee0 20 20 20 20 20 20 20 20 2f 2a 20 73 69 6c 65 6e          /* silen
25ef0 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  tly leak if fail
25f00 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72  , already in err
25f10 6f 72 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f  or */.      goto
25f20 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
25f30 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
25f40 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66  f FD_CLOEXEC.  f
25f50 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
25f60 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  , fcntl(fd, F_GE
25f70 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
25f80 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  EXEC);.#endif.. 
25f90 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21   noLock = eType!
25fa0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
25fb0 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65  N_DB;..  .#if de
25fc0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
25fd0 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
25fe0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
25ff0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
26000 66 73 49 6e 66 6f 3b 0a 20 20 69 66 28 20 66 73  fsInfo;.  if( fs
26010 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66  tatfs(fd, &fsInf
26020 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
26030 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
26040 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  e)->lastErrno = 
26050 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 64  errno;.    if( d
26060 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
26070 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  dirfd); /* silen
26080 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  tly leak if fail
26090 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , in error */.  
260a0 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
260b0 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66  silently leak if
260c0 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20   fail, in error 
260d0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
260e0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
260f0 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
26100 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73  = strncmp("msdos
26110 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
26120 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
26130 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
26140 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
26150 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
26160 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65  IS_MSDOS;.  }.#e
26170 6e 64 69 66 0a 20 20 0a 23 69 66 20 53 51 4c 49  ndif.  .#if SQLI
26180 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
26190 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49  G_STYLE.#if SQLI
261a0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
261b0 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f  LOCKING.  isAuto
261c0 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69  Proxy = 1;.#endi
261d0 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72  f.  if( isAutoPr
261e0 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e  oxy && (zPath!=N
261f0 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b  ULL) && (!noLock
26200 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  ) && pVfs->xOpen
26210 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
26220 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
26230 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
26240 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
26250 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
26260 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
26270 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
26280 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
26290 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
262a0 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
262b0 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
262c0 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
262d0 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
262e0 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
262f0 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
26300 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
26310 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
26320 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
26330 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
26340 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72 75 63  lse{.      struc
26350 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
26360 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66  .      if( statf
26370 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
26380 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  ) == -1 ){.     
26390 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
263a0 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63   the close(fd) c
263b0 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d  all is sub-optim
263c0 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  al. If the file 
263d0 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a  opened.        *
263e0 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64  * with fd is a d
263f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
26400 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  d there are othe
26410 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70  r connections op
26420 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
26430 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
26440 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f  are currently ho
26450 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c  lding advisory l
26460 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20  ocks on it,.    
26470 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
26480 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20  call to close() 
26490 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73  will cancel thos
264a0 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63  e locks. In prac
264b0 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tice,.        **
264c0 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
264d0 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f  that statfs() do
264e0 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20  esn't fail very 
264f0 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a  often. At least.
26500 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77          ** not w
26510 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20  hile other file 
26520 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
26530 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ed by the same p
26540 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20  rocess on.      
26550 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69    ** the same fi
26560 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20  le are working. 
26570 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   */.        p->l
26580 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
26590 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 69  ;.        if( di
265a0 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rfd>=0 ){.      
265b0 20 20 20 20 63 6c 6f 73 65 28 64 69 72 66 64 29      close(dirfd)
265c0 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
265d0 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65  ak if fail, in e
265e0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
265f0 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  }.        close(
26600 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  fd); /* silently
26610 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69   leak if fail, i
26620 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
26630 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
26640 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
26650 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
26660 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
26670 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
26680 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
26690 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
266a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
266b0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
266c0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
266d0 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72  le(pVfs, fd, dir
266e0 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
266f0 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65  , noLock, isDele
26700 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
26710 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26720 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
26730 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
26740 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ile((unixFile*)p
26750 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b  File, ":auto:");
26760 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
26770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26780 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75          /* Use u
26790 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61  nixClose to clea
267a0 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63  n up the resourc
267b0 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c  es added in fill
267c0 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20  InUnixFile .    
267d0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65        ** and cle
267e0 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63  ar all the struc
267f0 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65  ture's reference
26800 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
26810 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
26820 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
26830 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20  will be NULL so 
26840 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77  sqlite3OsClose w
26850 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a  ill be a no-op .
26860 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
26870 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65         unixClose
26880 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
26890 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
268a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
268b0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
268c0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
268d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
268e0 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
268f0 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69  ile(pVfs, fd, di
26900 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74  rfd, pFile, zPat
26910 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c  h, noLock, isDel
26920 65 74 65 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73  ete);.open_finis
26930 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  hed:.  if( rc!=S
26940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26950 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
26960 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20  pUnused);.  }.  
26970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
26980 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
26990 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49  file at zPath. I
269a0 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72  f the dirSync ar
269b0 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
269c0 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64  fsync().** the d
269d0 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64  irectory after d
269e0 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
269f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26a00 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71  unixDelete(.  sq
26a10 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
26a20 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63  ed,     /* VFS c
26a30 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61  ontaining this a
26a40 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65  s the xDelete me
26a50 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
26a60 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
26a70 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
26a80 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
26a90 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79  d */.  int dirSy
26aa0 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
26ab0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79   /* If true, fsy
26ac0 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61  nc() directory a
26ad0 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69  fter deleting fi
26ae0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
26af0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26b00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26b10 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
26b20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
26b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
26b40 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28  R_DELETE);.  if(
26b50 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d   unlink(zPath)==
26b60 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45  (-1) && errno!=E
26b70 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74  NOENT ){.    ret
26b80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
26b90 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 69 66  _DELETE;.  }.#if
26ba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
26bb0 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66  BLE_DIRSYNC.  if
26bc0 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20  ( dirSync ){.   
26bd0 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
26be0 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
26bf0 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20  zPath, &fd);.   
26c00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26c10 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  OK ){.#if OS_VXW
26c20 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66  ORKS.      if( f
26c30 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23  sync(fd)==-1 ).#
26c40 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66  else.      if( f
26c50 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69  sync(fd) ).#endi
26c60 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
26c70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
26c80 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20  ERR_DIR_FSYNC;. 
26c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26ca0 20 63 6c 6f 73 65 28 66 64 29 26 26 21 72 63 20   close(fd)&&!rc 
26cb0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26cc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
26cd0 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a  _CLOSE;.      }.
26ce0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
26cf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26d00 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  ./*.** Test the 
26d10 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20  existance of or 
26d20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
26d30 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68  ns of file zPath
26d40 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65  . The.** test pe
26d50 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20  rformed depends 
26d60 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
26d70 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
26d80 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
26d90 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20  XISTS: Return 1 
26da0 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  if the file exis
26db0 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ts.**     SQLITE
26dc0 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
26dd0 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  E: Return 1 if t
26de0 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20  he file is read 
26df0 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a  and writable..**
26e00 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
26e10 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74  SS_READONLY: Ret
26e20 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
26e30 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a  e is readable..*
26e40 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72  *.** Otherwise r
26e50 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
26e60 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73  ic int unixAcces
26e70 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
26e80 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20   *NotUsed,   /* 
26e90 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69  The VFS containi
26ea0 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20  ng this xAccess 
26eb0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
26ec0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
26ed0 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74      /* Path of t
26ee0 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69  he file to exami
26ef0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ne */.  int flag
26f00 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
26f10 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61  /* What do we wa
26f20 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75  nt to learn abou
26f30 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65  t the zPath file
26f40 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  ? */.  int *pRes
26f50 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Out            /
26f60 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62  * Write result b
26f70 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29  oolean here */.)
26f80 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20  {.  int amode = 
26f90 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
26fa0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
26fb0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
26fc0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
26fd0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
26fe0 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
26ff0 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
27000 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
27010 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TS:.      amode 
27020 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = F_OK;.      br
27030 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
27040 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
27050 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f  WRITE:.      amo
27060 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a  de = W_OK|R_OK;.
27070 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27080 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
27090 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20  ESS_READ:.      
270a0 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20  amode = R_OK;.  
270b0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
270c0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
270d0 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
270e0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
270f0 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
27100 20 3d 20 28 61 63 63 65 73 73 28 7a 50 61 74 68   = (access(zPath
27110 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20  , amode)==0);.  
27120 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54  if( flags==SQLIT
27130 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
27140 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20  && *pResOut ){. 
27150 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
27160 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  uf;.    if( 0==s
27170 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29  tat(zPath, &buf)
27180 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d   && buf.st_size=
27190 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  =0 ){.      *pRe
271a0 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  sOut = 0;.    }.
271b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
271c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
271d0 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
271e0 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
271f0 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
27200 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   The relative pa
27210 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  th.** is stored 
27220 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  as a nul-termina
27230 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68  ted string in th
27240 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
27250 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e   to by.** zPath.
27260 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69   .**.** zOut poi
27270 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
27280 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69  of at least sqli
27290 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
272a0 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e  me bytes .** (in
272b0 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f   this case, MAX_
272c0 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e  PATHNAME bytes).
272d0 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69   The full-path i
272e0 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  s written to.** 
272f0 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f  this buffer befo
27300 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
27310 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27320 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
27330 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
27340 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
27350 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
27360 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
27370 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
27380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
27390 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
273a0 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
273b0 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20  nt nOut,        
273c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
273d0 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
273e0 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
273f0 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20  /.  char *zOut  
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27410 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
27420 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49  er */.){..  /* I
27430 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
27440 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
27450 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
27460 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
27470 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
27480 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
27490 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
274a0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
274b0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
274c0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
274d0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
274e0 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
274f0 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
27500 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
27510 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
27520 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
27530 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
27540 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
27550 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61  TE_ERROR );..  a
27560 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50  ssert( pVfs->mxP
27570 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54  athname==MAX_PAT
27580 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45  HNAME );.  UNUSE
27590 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
275a0 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d  );..  zOut[nOut-
275b0 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28  1] = '\0';.  if(
275c0 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29   zPath[0]=='/' )
275d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
275e0 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
275f0 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
27600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
27610 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20  t nCwd;.    if( 
27620 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  getcwd(zOut, nOu
27630 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1)==0 ){.     
27640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27650 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
27660 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28    }.    nCwd = (
27670 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29  int)strlen(zOut)
27680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
27690 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64  printf(nOut-nCwd
276a0 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22  , &zOut[nCwd], "
276b0 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  /%s", zPath);.  
276c0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
276d0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  E_OK;.}...#ifnde
276e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
276f0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
27700 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
27710 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
27720 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
27730 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
27740 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
27750 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
27760 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
27770 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
27780 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
27790 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
277a0 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c   *unixDlOpen(sql
277b0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
277c0 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
277d0 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55  Filename){.  UNU
277e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
277f0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
27800 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   dlopen(zFilenam
27810 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54  e, RTLD_NOW | RT
27820 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f  LD_GLOBAL);.}../
27830 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c  *.** SQLite call
27840 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
27850 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
27860 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  r a call to unix
27870 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e  DlSym() or.** un
27880 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73  ixDlOpen() fails
27890 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c   (returns a null
278a0 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20   pointer). If a 
278b0 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72  more detailed er
278c0 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
278d0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20  s available, it 
278e0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42  is written to zB
278f0 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72  ufOut. If no err
27900 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73  or message.** is
27910 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66   available, zBuf
27920 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  Out is left unmo
27930 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74  dified and SQLit
27940 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74  e uses a default
27950 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
27960 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
27970 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71  d unixDlError(sq
27980 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
27990 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
279a0 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
279b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
279c0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
279d0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
279e0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
279f0 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72  );.  zErr = dler
27a00 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72  ror();.  if( zEr
27a10 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
27a20 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
27a30 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a  zBufOut, "%s", z
27a40 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  Err);.  }.  unix
27a50 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
27a60 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e  static void (*un
27a70 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  ixDlSym(sqlite3_
27a80 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
27a90 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
27aa0 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a  r*zSym))(void){.
27ab0 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77    /* .  ** GCC w
27ac0 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
27ad0 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43  rors says that C
27ae0 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  90 does not allo
27af0 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a  w a void* to be.
27b00 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61    ** cast into a
27b10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
27b20 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74  nction.  And yet
27b30 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73   the library dls
27b40 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a  ym() routine.  *
27b50 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64  * returns a void
27b60 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c  * which is reall
27b70 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
27b80 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68   function.  So h
27b90 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73  ow do we.  ** us
27ba0 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d  e dlsym() with -
27bb0 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f  pedantic-errors?
27bc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  **.  ** Varia
27bd0 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64  ble x below is d
27be0 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  efined to be a p
27bf0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
27c00 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a  tion taking.  **
27c10 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64   parameters void
27c20 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72  * and const char
27c30 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  * and returning 
27c40 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
27c50 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65  unction..  ** We
27c60 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79   initialize x by
27c70 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
27c80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
27c90 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lsym() function.
27ca0 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69  .  ** (That assi
27cb0 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20  gnment requires 
27cc0 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77  a cast.)  Then w
27cd0 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74  e call the funct
27ce0 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20  ion that.  ** x 
27cf0 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a  points to.  .  *
27d00 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b  *.  ** This work
27d10 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b  -around is unlik
27d20 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72  ely to work corr
27d30 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73  ectly on any sys
27d40 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79  tem where.  ** y
27d50 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74  ou really cannot
27d60 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e   cast a function
27d70 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f   pointer into vo
27d80 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20  id*.  But then, 
27d90 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  on the.  ** othe
27da0 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20  r hand, dlsym() 
27db0 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  will not work on
27dc0 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65   such a system e
27dd0 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76  ither, so we hav
27de0 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c  e.  ** not reall
27df0 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e  y lost anything.
27e00 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28  .  */.  void (*(
27e10 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  *x)(void*,const 
27e20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20  char*))(void);. 
27e30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27e40 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20  R(NotUsed);.  x 
27e50 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69  = (void(*(*)(voi
27e60 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
27e70 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20  (void))dlsym;.  
27e80 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a  return (*x)(p, z
27e90 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Sym);.}.static v
27ea0 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28  oid unixDlClose(
27eb0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
27ec0 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e  Used, void *pHan
27ed0 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
27ee0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
27ef0 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61  );.  dlclose(pHa
27f00 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  ndle);.}.#else /
27f10 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
27f20 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
27f30 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
27f40 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f   #define unixDlO
27f50 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
27f60 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20   unixDlError 0. 
27f70 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53   #define unixDlS
27f80 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
27f90 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23   unixDlClose 0.#
27fa0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
27fb0 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
27fc0 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20   random data to 
27fd0 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
27fe0 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer zBuf..*/.sta
27ff0 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64  tic int unixRand
28000 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
28010 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
28020 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
28030 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
28040 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
28050 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f  .  assert((size_
28060 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28  t)nBuf>=(sizeof(
28070 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69  time_t)+sizeof(i
28080 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  nt)));..  /* We 
28090 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  have to initiali
280a0 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65  ze zBuf to preve
280b0 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  nt valgrind from
280c0 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20   reporting.  ** 
280d0 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70  errors.  The rep
280e0 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76  orts issued by v
280f0 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f  algrind are inco
28100 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64  rrect - we would
28110 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61  .  ** prefer tha
28120 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  t the randomness
28130 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79   be increased by
28140 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74   making use of t
28150 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61  he.  ** uninitia
28160 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a  lized space in z
28170 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69  Buf - but valgri
28180 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74  nd errors tend t
28190 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d  o worry.  ** som
281a0 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72  e users.  Rather
281b0 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20   than argue, it 
281c0 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73  seems easier jus
281d0 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
281e0 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61    ** the whole a
281f0 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65  rray and silence
28200 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20   valgrind, even 
28210 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65  if that means le
28220 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20  ss randomness.  
28230 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d  ** in the random
28240 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   seed..  **.  **
28250 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69   When testing, i
28260 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66  nitializing zBuf
28270 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c  [] to zero is al
28280 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d  l we do.  That m
28290 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  eans.  ** that w
282a0 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
282b0 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d   same random num
282c0 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ber sequence.  T
282d0 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20  his makes the.  
282e0 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61  ** tests repeata
282f0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  ble..  */.  mems
28300 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
28310 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
28320 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b  SQLITE_TEST).  {
28330 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64  .    int pid, fd
28340 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
28350 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
28360 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69  O_RDONLY);.    i
28370 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
28380 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
28390 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
283a0 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
283b0 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
283c0 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
283d0 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ();.      memcpy
283e0 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29  (&zBuf[sizeof(t)
283f0 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
28400 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73  pid));.      ass
28410 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73  ert( sizeof(t)+s
28420 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a  izeof(pid)<=(siz
28430 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  e_t)nBuf );.    
28440 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28    nBuf = sizeof(
28450 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29  t) + sizeof(pid)
28460 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28470 20 20 20 6e 42 75 66 20 3d 20 72 65 61 64 28 66     nBuf = read(f
28480 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a  d, zBuf, nBuf);.
28490 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
284a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
284b0 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b  f.  return nBuf;
284c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
284d0 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
284e0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
284f0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
28500 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72  slept..** The ar
28510 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75  gument is the nu
28520 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
28530 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20  onds we want to 
28540 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65  sleep..** The re
28550 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
28560 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
28570 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65  oseconds of slee
28580 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  p actually.** re
28590 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
285a0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
285b0 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20  ating system, a 
285c0 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20  number which.** 
285d0 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72  might be greater
285e0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
285f0 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  o the argument, 
28600 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20  but not less.** 
28610 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  than the argumen
28620 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
28630 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74   unixSleep(sqlit
28640 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
28650 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
28660 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  s){.#if OS_VXWOR
28670 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
28680 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74  spec sp;..  sp.t
28690 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63  v_sec = microsec
286a0 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a  onds / 1000000;.
286b0 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28    sp.tv_nsec = (
286c0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31  microseconds % 1
286d0 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a  000000) * 1000;.
286e0 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c    nanosleep(&sp,
286f0 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44   NULL);.  UNUSED
28700 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
28710 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
28720 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69  croseconds;.#eli
28730 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
28740 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
28750 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
28760 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20  icroseconds);.  
28770 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28780 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
28790 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
287a0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65  ;.#else.  int se
287b0 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65  conds = (microse
287c0 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30  conds+999999)/10
287d0 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73  00000;.  sleep(s
287e0 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
287f0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
28800 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  sed);.  return s
28810 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a  econds*1000000;.
28820 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
28830 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
28840 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
28850 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
28860 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
28870 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
28880 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
28890 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
288a0 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
288b0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
288c0 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
288d0 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
288e0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
288f0 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
28900 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
28910 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
28920 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
28930 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
28940 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
28950 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
28960 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
28970 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
28980 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
28990 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
289a0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
289b0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
289c0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
289d0 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
289e0 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
289f0 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
28a00 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
28a10 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
28a20 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
28a30 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
28a40 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
28a50 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
28a60 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
28a70 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
28a80 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
28a90 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
28aa0 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
28ab0 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  s, return 0.  Re
28ac0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
28ad0 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
28ae0 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
28af0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
28b00 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
28b10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
28b20 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  Used, sqlite3_in
28b30 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73  t64 *piNow){.  s
28b40 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
28b50 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
28b60 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
28b70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
28b80 34 30 30 30 30 3b 0a 23 69 66 20 64 65 66 69 6e  40000;.#if defin
28b90 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20  ed(NO_GETTOD).  
28ba0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
28bb0 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  (&t);.  *piNow =
28bc0 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ((sqlite3_int64
28bd0 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45  )t)*1000 + unixE
28be0 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56  poch;.#elif OS_V
28bf0 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
28c00 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20  timespec sNow;. 
28c10 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43   clock_gettime(C
28c20 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26  LOCK_REALTIME, &
28c30 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  sNow);.  *piNow 
28c40 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
28c50 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
28c60 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
28c70 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30  sNow.tv_nsec/100
28c80 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74  0000;.#else.  st
28c90 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
28ca0 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  w;.  gettimeofda
28cb0 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a  y(&sNow, 0);.  *
28cc0 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
28cd0 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
28ce0 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
28cf0 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  sec + sNow.tv_us
28d00 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a  ec/1000;.#endif.
28d10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
28d20 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
28d30 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
28d40 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
28d50 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
28d60 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
28d70 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
28d80 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
28d90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28da0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
28db0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
28dc0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
28dd0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
28de0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
28df0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
28e00 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
28e10 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
28e20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
28e30 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
28e40 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
28e50 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
28e60 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
28e70 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
28e80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
28e90 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
28ea0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
28eb0 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
28ec0 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ow){.  sqlite3_i
28ed0 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55 53 45 44  nt64 i;.  UNUSED
28ee0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
28ef0 65 64 29 3b 0a 20 20 75 6e 69 78 43 75 72 72 65  ed);.  unixCurre
28f00 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26  ntTimeInt64(0, &
28f10 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69  i);.  *prNow = i
28f20 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72  /86400000.0;.  r
28f30 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
28f40 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20 78  * We added the x
28f50 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d  GetLastError() m
28f60 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20 69  ethod with the i
28f70 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76  ntention of prov
28f80 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20  iding.** better 
28f90 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
28fa0 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70  messages when op
28fb0 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70  erating-system p
28fc0 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a  roblems come up.
28fd0 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ** during SQLite
28fe0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
28ff0 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66   so far, none of
29000 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 69   that has been i
29010 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e  mplemented.** in
29020 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74   the core.  So t
29030 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
29040 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f  ever called.  Fo
29050 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72  r now, it is mer
29060 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68  ely.** a place-h
29070 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  older..*/.static
29080 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74   int unixGetLast
29090 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
290a0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
290b0 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a  NotUsed2, char *
290c0 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55  NotUsed3){.  UNU
290d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
290e0 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44  tUsed);.  UNUSED
290f0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
29100 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2);.  UNUSED_P
29110 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
29120 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  3);.  return 0;.
29130 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../*.*********
29140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
29150 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  End of sqlite3_v
29160 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
29170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29180 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
29190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291d0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
291e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29220 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
29230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29240 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c  ** Begin Proxy L
29250 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
29260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29270 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72  *******.**.** Pr
29280 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
29290 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d   "uber-locking-m
292a0 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73  ethod" in this s
292b0 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74  ense:  It uses t
292c0 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  he.** other lock
292d0 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73  ing methods on s
292e0 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69  econdary lock fi
292f0 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b  les.  Proxy lock
29300 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61  ing is a.** meta
29310 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20  -layer over top 
29320 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  of the primitive
29330 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
29340 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72  nted above.  For
29350 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  .** this reason,
29360 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
29370 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66  at implements of
29380 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
29390 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e  s deferred.** un
293a0 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20  til late in the 
293b0 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65  file (here) afte
293c0 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68  r all of the oth
293d0 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68  er I/O methods h
293e0 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69  ave.** been defi
293f0 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68  ned - so that th
29400 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
29410 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20  ing methods are 
29420 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20  available.** as 
29430 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70  services to help
29440 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d   with the implem
29450 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78  entation of prox
29460 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  y locking..**.**
29470 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  **.**.** The def
29480 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68  ault locking sch
29490 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75  emes in SQLite u
294a0 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  se byte-range lo
294b0 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  cks on the.** da
294c0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
294d0 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20  oordinate safe, 
294e0 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73  concurrent acces
294f0 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65  s by multiple re
29500 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69  aders.** and wri
29510 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c  ters [http://sql
29520 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76  ite.org/lockingv
29530 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69  3.html].  The fi
29540 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  ve file locking.
29550 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43  ** states (UNLOC
29560 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48  KED, PENDING, SH
29570 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
29580 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69  EXCLUSIVE) are i
29590 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73  mplemented.** as
295a0 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72   POSIX read & wr
295b0 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66  ite locks over f
295c0 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61  ixed set of loca
295d0 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c  tions (via fsctl
295e0 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64  ),.** on AFP and
295f0 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73   SMB only exclus
29600 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  ive byte-range l
29610 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62  ocks are availab
29620 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20  le via fsctl.** 
29630 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20  with _IOWR('z', 
29640 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
29650 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20  angeLockPB2) to 
29660 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35  track the same 5
29670 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73   states..** To s
29680 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43  imulate a F_RDLC
29690 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  K on the shared 
296a0 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20  range, on AFP a 
296b0 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
296c0 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20  d.** address in 
296d0 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
296e0 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20   is taken for a 
296f0 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
29700 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65   entire.** share
29710 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
29720 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56   for an EXCLUSIV
29730 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20  E lock):.**.**  
29740 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
29750 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
29760 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20  00..   ..**     
29770 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
29780 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
29790 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
297a0 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
297b0 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
297c0 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
297d0 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
297e0 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
297f0 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
29800 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
29810 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
29820 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
29830 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
29840 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
29850 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
29860 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
29870 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
29880 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
29890 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
298a0 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
298b0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
298c0 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
298d0 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
298e0 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
298f0 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
29900 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
29910 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
29920 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
29930 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
29940 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
29950 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
29960 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
29970 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
29980 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
29990 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
299a0 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
299b0 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
299c0 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
299d0 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
299e0 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
299f0 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
29a00 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
29a10 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
29a20 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
29a30 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
29a40 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
29a50 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
29a60 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
29a70 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
29a80 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
29a90 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
29aa0 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
29ab0 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
29ac0 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
29ad0 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
29ae0 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
29af0 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
29b00 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
29b10 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
29b20 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
29b30 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
29b40 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
29b50 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
29b60 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
29b70 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
29b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
29b90 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
29ba0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
29bb0 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
29bc0 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
29bd0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bf0 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74        <proxy_pat
29c00 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  h> | ":auto:");.
29c10 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
29c20 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
29c30 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ame, SQLITE_GET_
29c40 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26  LOCKPROXYFILE, &
29c50 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
29c60 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
29c70 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
29c80 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
29c90 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
29ca0 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
29cb0 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
29cc0 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
29cd0 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
29ce0 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
29cf0 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
29d00 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
29d10 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
29d20 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
29d30 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
29d40 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
29d50 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
29d60 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
29d70 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
29d80 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
29d90 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
29da0 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
29db0 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
29dc0 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
29dd0 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
29de0 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
29df0 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
29e00 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
29e10 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
29e20 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
29e30 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
29e40 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
29e50 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
29e60 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
29e70 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
29e80 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
29e90 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
29ea0 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
29eb0 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
29ec0 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
29ed0 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
29ee0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
29ef0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
29f00 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
29f10 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
29f20 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
29f30 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
29f40 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
29f50 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
29f60 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
29f70 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
29f80 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
29f90 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
29fa0 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
29fb0 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
29fc0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
29fd0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
29fe0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
29ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
2a000 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
2a010 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
2a020 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
2a030 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
2a040 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
2a050 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
2a060 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
2a070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a080 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
2a090 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
2a0a0 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
2a0b0 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
2a0c0 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
2a0d0 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
2a0e0 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
2a0f0 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
2a100 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
2a110 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
2a120 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
2a130 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
2a140 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
2a150 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
2a160 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
2a170 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
2a180 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
2a190 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
2a1a0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
2a1b0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
2a1c0 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
2a1d0 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
2a1e0 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
2a1f0 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
2a200 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
2a210 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
2a220 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
2a230 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
2a240 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
2a250 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
2a260 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
2a270 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
2a280 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
2a290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a2a0 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
2a2b0 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
2a2c0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
2a2d0 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
2a2e0 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63  exist, or it's c
2a2f0 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
2a300 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
2a310 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
2a320 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
2a330 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
2a340 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
2a350 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
2a360 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
2a370 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
2a380 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
2a390 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
2a3a0 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
2a3b0 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
2a3c0 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
2a3d0 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
2a3e0 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
2a3f0 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
2a400 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
2a410 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
2a420 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
2a430 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
2a440 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
2a450 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
2a460 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
2a470 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
2a480 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
2a490 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
2a4a0 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
2a4b0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
2a4c0 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
2a4d0 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
2a4e0 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
2a4f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a500 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
2a510 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
2a520 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
2a530 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
2a540 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
2a550 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
2a560 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
2a570 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65  le)..**.** Reque
2a580 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70  sting the lock p
2a590 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d  roxy does not im
2a5a0 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74  mediately take t
2a5b0 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a  he conch, it is.
2a5c0 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68  ** only taken wh
2a5d0 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71  en the first req
2a5e0 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74  uest to lock dat
2a5f0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61  abase file is ma
2a600 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61  de.  .** This ma
2a610 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74  tches the semant
2a620 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69  ics of the tradi
2a630 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62  tional locking b
2a640 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a  ehavior, where.*
2a650 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e  * opening a conn
2a660 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
2a670 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e  base file does n
2a680 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f  ot take a lock o
2a690 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61  n it..** The sha
2a6a0 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20  red lock and an 
2a6b0 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
2a6c0 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69  ptor are maintai
2a6d0 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68  ned until .** th
2a6e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
2a6f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2a700 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  closed. .**.** T
2a710 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e  he proxy file an
2a720 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  d the lock file 
2a730 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65  are never delete
2a740 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e  d so they only n
2a750 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65  eed.** to be cre
2a760 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74  ated the first t
2a770 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65  ime they are use
2a780 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  d..**.** Configu
2a790 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a  ration options.*
2a7a0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
2a7b0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53  -------.**.**  S
2a7c0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
2a7d0 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a  XY_LOCKING.**.**
2a7e0 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20         Database 
2a7f0 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f  files accessed o
2a800 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  n non-local file
2a810 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20   systems are.** 
2a820 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61        automatica
2a830 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  lly configured f
2a840 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
2a850 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65  , lock files are
2a860 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20  .**       named 
2a870 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73  automatically us
2a880 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67  ing the same log
2a890 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50  ic as.**       P
2a8a0 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79  RAGMA lock_proxy
2a8b0 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a  _file=":auto:".*
2a8c0 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45  *    .**  SQLITE
2a8d0 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a  _PROXY_DEBUG.**.
2a8e0 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73  **       Enables
2a8f0 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20   the logging of 
2a900 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64  error messages d
2a910 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69  uring host id fi
2a920 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72  le.**       retr
2a930 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69  ieval and creati
2a940 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52  on.**.**  LOCKPR
2a950 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20  OXYDIR.**.**    
2a960 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65     Overrides the
2a970 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
2a980 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
2a990 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61   proxy files tha
2a9a0 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e  t.**       are n
2a9b0 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
2a9c0 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74  ly via the ":aut
2a9d0 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a  o:" setting.**.*
2a9e0 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  *  SQLITE_DEFAUL
2a9f0 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
2aa00 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20  SSIONS.**.**    
2aa10 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74     Permissions t
2aa20 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
2aa30 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
2aa40 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a  for storing the.
2aa50 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72  **       lock pr
2aa60 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20  oxy files, only 
2aa70 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52  used when LOCKPR
2aa80 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65  OXYDIR is not se
2aa90 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  t..**    .**    
2aaa0 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64  .** As mentioned
2aab0 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d   above, when com
2aac0 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
2aad0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2aae0 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69  OCKING,.** setti
2aaf0 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  ng the environme
2ab00 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49  nt variable SQLI
2ab10 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
2ab20 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c  OCKING to 1 will
2ab30 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20  .** force proxy 
2ab40 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73  locking to be us
2ab50 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  ed for every dat
2ab60 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65  abase file opene
2ab70 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c  d, and 0.** will
2ab80 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63   force automatic
2ab90 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
2aba0 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f  o be disabled fo
2abb0 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
2abc0 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69  * files (explici
2abd0 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ty calling the S
2abe0 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
2abf0 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f  OXYFILE pragma o
2ac00 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65  r.** sqlite_file
2ac10 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20  _control API is 
2ac20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20  not affected by 
2ac30 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
2ac40 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a  XY_LOCKING)..*/.
2ac50 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  ./*.** Proxy loc
2ac60 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
2ac70 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
2ac80 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
2ac90 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2aca0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2acb0 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
2acc0 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
2acd0 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
2ace0 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
2acf0 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
2ad00 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
2ad10 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
2ad20 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
2ad30 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
2ad40 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2ad50 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2ad60 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
2ad70 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2ad80 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
2ad90 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
2ada0 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
2adb0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
2adc0 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
2add0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2ade0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2adf0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
2ae00 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
2ae10 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
2ae20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
2ae30 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
2ae40 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
2ae50 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
2ae60 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
2ae70 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae90 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
2aea0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
2aeb0 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
2aec0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20          /* 1 if 
2aed0 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c  the conch is hel
2aee0 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73  d, -1 if lockles
2aef0 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
2af00 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
2af10 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
2af20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
2af30 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
2af40 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
2af50 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
2af60 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
2af70 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
2af80 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
2af90 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
2afa0 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
2afb0 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
2afc0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
2afd0 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
2afe0 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
2aff0 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
2b000 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
2b010 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
2b020 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
2b030 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
2b040 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
2b050 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
2b060 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
2b070 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
2b080 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
2b090 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
2b0a0 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
2b0b0 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
2b0c0 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
2b0d0 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
2b0e0 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
2b0f0 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
2b100 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
2b110 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
2b120 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
2b130 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
2b140 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
2b150 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
2b160 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
2b170 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
2b180 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
2b190 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
2b1a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2b1b0 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
2b1c0 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
2b1d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b1e0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
2b1f0 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  }.    len = strl
2b200 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
2b210 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
2b220 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c  n);    .  }.# el
2b230 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
2b240 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
2b250 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
2b260 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
2b270 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
2b280 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
2b290 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
2b2a0 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
2b2b0 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
2b2c0 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
2b2d0 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
2b2e0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
2b2f0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
2b300 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
2b310 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
2b320 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d  (i+len+7)<(int)m
2b330 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  axLen; i++){.   
2b340 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68   char c = dbPath
2b350 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69  [i];.    lPath[i
2b360 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29  +len] = (c=='/')
2b370 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50  ?'_':c;.  }.  lP
2b380 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b  ath[i+len]='\0';
2b390 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68  .  strlcat(lPath
2b3a0 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c  , ":auto:", maxL
2b3b0 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  en);.  OSTRACE((
2b3c0 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72  "GETLOCKPATH  pr
2b3d0 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
2b3e0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
2b3f0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
2b400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b410 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72  K;.}../* . ** Cr
2b420 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66  eates the lock f
2b430 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73  ile and any miss
2b440 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20  ing directories 
2b450 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a  in lockPath. */.
2b460 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2b470 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63  CreateLockPath(c
2b480 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50  onst char *lockP
2b490 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c  ath){.  int i, l
2b4a0 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d  en;.  char buf[M
2b4b0 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e  AXPATHLEN];.  in
2b4c0 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a  t start = 0;.  .
2b4d0 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74    assert(lockPat
2b4e0 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74  h!=NULL);.  /* t
2b4f0 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c  ry to create all
2b500 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
2b510 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f  e directories */
2b520 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  .  len = (int)st
2b530 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a  rlen(lockPath);.
2b540 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50    buf[0] = lockP
2b550 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69  ath[0];.  for( i
2b560 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29  =1; i<len; i++ )
2b570 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61  {.    if( lockPa
2b580 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[i] == '/' && 
2b590 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20  (i - start > 0) 
2b5a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  ){.      /* only
2b5b0 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64   mkdir if leaf d
2b5c0 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22  ir != "." or "/"
2b5d0 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20   or ".." */.    
2b5e0 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20    if( i-start>2 
2b5f0 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26  || (i-start==1 &
2b600 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
2b610 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
2b620 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20  ] != '/') .     
2b630 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d      || (i-start=
2b640 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =2 && buf[start]
2b650 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
2b660 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20  tart+1] != '.') 
2b670 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69  ){.        buf[i
2b680 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  ]='\0';.        
2b690 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c 20 53  if( mkdir(buf, S
2b6a0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
2b6b0 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
2b6c0 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NS) ){.         
2b6d0 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
2b6e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
2b6f0 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20  r!=EEXIST ) {.  
2b700 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
2b710 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
2b720 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61 74  TH  FAILED creat
2b730 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20  ing %s, ".      
2b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2b750 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20  '%s' proxy lock 
2b760 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
2b770 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2b780 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74 72          buf, str
2b790 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b  error(err), lock
2b7a0 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
2b7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
2b7c0 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20  turn err;.      
2b7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b7e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
2b7f0 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  art=i+1;.    }. 
2b800 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b     buf[i] = lock
2b810 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f  Path[i];.  }.  O
2b820 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c  STRACE(("CREATEL
2b830 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
2b840 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
2b850 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c  %d\n", lockPath,
2b860 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72   getpid()));.  r
2b870 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2b880 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
2b890 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
2b8a0 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
2b8b0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
2b8c0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
2b8d0 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
2b8e0 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
2b8f0 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
2b900 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
2b910 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
2b920 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
2b930 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
2b940 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
2b950 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
2b960 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
2b970 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
2b980 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
2b990 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
2b9a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2b9b0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
2b9c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2b9d0 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
2b9e0 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
2b9f0 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
2ba00 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
2ba10 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
2ba20 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
2ba30 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
2ba40 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
2ba50 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
2ba60 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
2ba70 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
2ba80 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
2ba90 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
2baa0 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72 66 64   -1;.  int dirfd
2bab0 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c   = -1;.  unixFil
2bac0 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  e *pNew;.  int r
2bad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bae0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
2baf0 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
2bb00 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  T;.  sqlite3_vfs
2bb10 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74   dummyVfs;.  int
2bb20 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55   terrno = 0;.  U
2bb30 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
2bb40 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  used = NULL;..  
2bb50 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20  /* 1. first try 
2bb60 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
2bb70 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20  he file.  ** 2. 
2bb80 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61  if that fails, a
2bb90 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63  nd this is a loc
2bba0 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63  k file (not-conc
2bbb0 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67  h), try creating
2bbc0 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74  .  ** the parent
2bbd0 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64   directories and
2bbe0 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e   then try again.
2bbf0 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74  .  ** 3. if that
2bc00 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f   fails, try to o
2bc10 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61  pen the file rea
2bc20 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  d-only.  ** othe
2bc30 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53  rwise return BUS
2bc40 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29  Y (if lock file)
2bc50 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72   or CANTOPEN for
2bc60 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a   the conch file.
2bc70 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d    */.  pUnused =
2bc80 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
2bc90 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29  path, openFlags)
2bca0 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20  ;.  if( pUnused 
2bcb0 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75  ){.    fd = pUnu
2bcc0 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65  sed->fd;.  }else
2bcd0 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  {.    pUnused = 
2bce0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
2bcf0 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
2bd00 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
2bd10 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
2bd20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2bd30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2bd40 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20   fd<0 ){.    fd 
2bd50 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65  = open(path, ope
2bd60 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44  nFlags, SQLITE_D
2bd70 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
2bd80 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65  ISSIONS);.    te
2bd90 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2bda0 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
2bdb0 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69  rno==ENOENT && i
2bdc0 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
2bdd0 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61     if( proxyCrea
2bde0 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29  teLockPath(path)
2bdf0 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   == SQLITE_OK ){
2be00 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 6f 70  .        fd = op
2be10 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
2be20 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  gs, SQLITE_DEFAU
2be30 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
2be40 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONS);.      }.  
2be50 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64    }.  }.  if( fd
2be60 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c  <0 ){.    openFl
2be70 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  ags = O_RDONLY;.
2be80 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61      fd = open(pa
2be90 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
2bea0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2beb0 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
2bec0 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
2bed0 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  rno;.  }.  if( f
2bee0 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  d<0 ){.    if( i
2bef0 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
2bf00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bf10 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
2bf20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
2bf30 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
2bf40 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
2bf50 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2bf60 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
2bf70 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
2bf80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
2bf90 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
2bfa0 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
2bfb0 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
2bfc0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
2bfd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
2bfe0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2bff0 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d  .  }.  .  pNew =
2c000 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c   (unixFile *)sql
2c010 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
2c020 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
2c030 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
2c040 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c050 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
2c060 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
2c070 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
2c080 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  New, 0, sizeof(u
2c090 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65  nixFile));.  pNe
2c0a0 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  w->openFlags = o
2c0b0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 64 75 6d 6d  penFlags;.  dumm
2c0c0 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20  yVfs.pAppData = 
2c0d0 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
2c0e0 49 6f 46 69 6e 64 65 72 3b 0a 20 20 70 55 6e 75  IoFinder;.  pUnu
2c0f0 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
2c100 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
2c110 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e   openFlags;.  pN
2c120 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55  ew->pUnused = pU
2c130 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d  nused;.  .  rc =
2c140 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
2c150 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 64  &dummyVfs, fd, d
2c160 69 72 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66  irfd, (sqlite3_f
2c170 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c  ile*)pNew, path,
2c180 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
2c190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c1a0 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65     *ppFile = pNe
2c1b0 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  w;.    return SQ
2c1c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64  LITE_OK;.  }.end
2c1d0 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20  _create_proxy:  
2c1e0 20 20 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 20    .  close(fd); 
2c1f0 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
2c200 20 66 64 20 69 66 20 65 72 72 6f 72 2c 20 77 65   fd if error, we
2c210 27 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 65  're already in e
2c220 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rror */.  sqlite
2c230 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
2c240 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e  sqlite3_free(pUn
2c250 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  used);.  return 
2c260 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
2c270 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d  LITE_TEST./* sim
2c280 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
2c290 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
2c2a0 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
2c2b0 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74  ile paths */.int
2c2c0 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
2c2d0 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  num = 0;.#endif.
2c2e0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
2c2f0 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20  OSTIDLEN    16  
2c300 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f  /* conch file ho
2c310 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a  st id length */.
2c320 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64  ./* Not always d
2c330 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65  efined in the he
2c340 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68  aders as it ough
2c350 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72  t to be */.exter
2c360 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69  n int gethostuui
2c370 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e  d(uuid_t id, con
2c380 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  st struct timesp
2c390 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67  ec *wait);../* g
2c3a0 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76  et the host ID v
2c3b0 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29  ia gethostuuid()
2c3c0 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70  , pHostID must p
2c3d0 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f  oint to PROXY_HO
2c3e0 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65  STIDLEN .** byte
2c3f0 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65  s of writable me
2c400 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
2c410 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74  int proxyGetHost
2c420 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ID(unsigned char
2c430 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a   *pHostID, int *
2c440 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72  pError){.  asser
2c450 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  t(PROXY_HOSTIDLE
2c460 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64  N == sizeof(uuid
2c470 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  _t));.  memset(p
2c480 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59  HostID, 0, PROXY
2c490 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66  _HOSTIDLEN);.#if
2c4a0 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f   defined(__MAX_O
2c4b0 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  S_X_VERSION_MIN_
2c4c0 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20 20 20  REQUIRED)\.     
2c4d0 20 20 20 20 20 20 20 20 20 20 26 26 20 5f 5f 4d            && __M
2c4e0 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f  AC_OS_X_VERSION_
2c4f0 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31 30 35  MIN_REQUIRED<105
2c500 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  0.  {.    static
2c510 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69   const struct ti
2c520 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d  mespec timeout =
2c530 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65   {1, 0}; /* 1 se
2c540 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20  c timeout */.   
2c550 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69 64   if( gethostuuid
2c560 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f  (pHostID, &timeo
2c570 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ut) ){.      int
2c580 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20   err = errno;.  
2c590 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
2c5a0 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f  {.        *pErro
2c5b0 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d  r = err;.      }
2c5c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2c5d0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
2c5e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  }.  }.#endif.#if
2c5f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2c600 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75    /* simulate mu
2c610 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
2c620 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
2c630 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
2c640 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  s */.  if( sqlit
2c650 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d  e3_hostid_num !=
2c660 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44   0){.    pHostID
2c670 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f  [0] = (char)(pHo
2c680 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29  stID[0] + (char)
2c690 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f  (sqlite3_hostid_
2c6a0 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20  num & 0xFF));.  
2c6b0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65  }.#endif.  .  re
2c6c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c6d0 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20  }../* The conch 
2c6e0 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
2c6f0 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69  e header, host i
2c700 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  d and lock file 
2c710 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  path. */.#define
2c720 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53   PROXY_CONCHVERS
2c730 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74  ION 2   /* 1-byt
2c740 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74  e header, 16-byt
2c750 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20  e host id, path 
2c760 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
2c770 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20  _HEADERLEN    1 
2c780 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
2c790 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f  header length */
2c7a0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50  .#define PROXY_P
2c7b0 41 54 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f  ATHINDEX    (PRO
2c7c0 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
2c7d0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64  XY_HOSTIDLEN).#d
2c7e0 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43  efine PROXY_MAXC
2c7f0 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f  ONCHLEN  (PROXY_
2c800 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
2c810 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54  HOSTIDLEN+MAXPAT
2c820 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61  HLEN)../* .** Ta
2c830 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63  kes an open conc
2c840 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74  h file, copies t
2c850 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61  he contents to a
2c860 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74 68   new path and th
2c870 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20  en moves .** it 
2c880 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79  back.  The newly
2c890 20 63 72 65 61 74 65 64 20 66 69 6c 65 27 73 20   created file's 
2c8a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2c8b0 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  is assigned to t
2c8c0 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65  he.** conch file
2c8d0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66   structure and f
2c8e0 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69  inally the origi
2c8f0 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  nal conch file d
2c900 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a  escriptor is .**
2c910 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e   closed.  Return
2c920 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73  s zero if succes
2c930 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sful..*/.static 
2c940 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f  int proxyBreakCo
2c950 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
2c960 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
2c970 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f  myHostID){.  pro
2c980 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2c990 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
2c9a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
2c9b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2c9c0 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
2c9d0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
2c9e0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
2c9f0 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41  .  char tPath[MA
2ca00 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61  XPATHLEN];.  cha
2ca10 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43  r buf[PROXY_MAXC
2ca20 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  ONCHLEN];.  char
2ca30 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e   *cPath = pCtx->
2ca40 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20  conchFilePath;. 
2ca50 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20   size_t readLen 
2ca60 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61  = 0;.  size_t pa
2ca70 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  thLen = 0;.  cha
2ca80 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22  r errmsg[64] = "
2ca90 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  ";.  int fd = -1
2caa0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b  ;.  int rc = -1;
2cab0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2cac0 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a  TER(myHostID);..
2cad0 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65    /* create a ne
2cae0 77 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63  w path by replac
2caf0 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27  e the trailing '
2cb00 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62  -conch' with '-b
2cb10 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c  reak' */.  pathL
2cb20 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61  en = strlcpy(tPa
2cb30 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41  th, cPath, MAXPA
2cb40 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61  THLEN);.  if( pa
2cb50 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e  thLen>MAXPATHLEN
2cb60 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c   || pathLen<6 ||
2cb70 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28   .     (strlcpy(
2cb80 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35  &tPath[pathLen-5
2cb90 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21  ], "break", 6) !
2cba0 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  = 5) ){.    sqli
2cbb0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2cbc0 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d  eof(errmsg),errm
2cbd0 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28  sg,"path error (
2cbe0 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61  len %d)",(int)pa
2cbf0 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  thLen);.    goto
2cc00 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
2cc10 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68    }.  /* read th
2cc20 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20  e conch content 
2cc30 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 70  */.  readLen = p
2cc40 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
2cc50 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41  h, buf, PROXY_MA
2cc60 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
2cc70 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f   if( readLen<PRO
2cc80 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a  XY_PATHINDEX ){.
2cc90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2cca0 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
2ccb0 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64  sg),errmsg,"read
2ccc0 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
2ccd0 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a  ,(int)readLen);.
2cce0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
2ccf0 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
2cd00 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
2cd10 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62   the temporary b
2cd20 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66  reak file */.  f
2cd30 64 20 3d 20 6f 70 65 6e 28 74 50 61 74 68 2c 20  d = open(tPath, 
2cd40 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
2cd50 4f 5f 45 58 43 4c 29 2c 20 53 51 4c 49 54 45 5f  O_EXCL), SQLITE_
2cd60 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2cd70 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28  MISSIONS);.  if(
2cd80 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c   fd<0 ){.    sql
2cd90 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2cda0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
2cdb0 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61  rmsg, "create fa
2cdc0 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
2cdd0 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
2cde0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
2cdf0 20 20 69 66 28 20 70 77 72 69 74 65 28 66 64 2c    if( pwrite(fd,
2ce00 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30   buf, readLen, 0
2ce10 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65  ) != (ssize_t)re
2ce20 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  adLen ){.    sql
2ce30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2ce40 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
2ce50 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69  rmsg, "write fai
2ce60 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
2ce70 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
2ce80 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
2ce90 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74   if( rename(tPat
2cea0 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20  h, cPath) ){.   
2ceb0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2cec0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
2ced0 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d  , errmsg, "renam
2cee0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
2cef0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
2cf00 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
2cf10 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
2cf20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2cf30 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63  "broke stale loc
2cf40 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74  k on %s\n", cPat
2cf50 68 29 3b 0a 20 20 63 6c 6f 73 65 28 63 6f 6e 63  h);.  close(conc
2cf60 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e  hFile->h);.  con
2cf70 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a  chFile->h = fd;.
2cf80 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65    conchFile->ope
2cf90 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
2cfa0 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f  | O_CREAT;..end_
2cfb0 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28  breaklock:.  if(
2cfc0 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66   rc ){.    if( f
2cfd0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  d>=0 ){.      un
2cfe0 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20  link(tPath);.   
2cff0 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
2d000 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
2d010 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20  stderr, "failed 
2d020 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c  to break stale l
2d030 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22  ock on %s, %s\n"
2d040 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29  , cPath, errmsg)
2d050 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2d060 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68  c;.}../* Take th
2d070 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2d080 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
2d090 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73  le and break a s
2d0a0 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65  tale lock if the
2d0b0 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74   .** host id mat
2d0c0 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ches..*/.static 
2d0d0 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  int proxyConchLo
2d0e0 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
2d0f0 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73  le, uuid_t myHos
2d100 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70  tID, int lockTyp
2d110 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
2d120 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
2d130 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
2d140 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
2d150 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
2d160 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
2d170 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
2d180 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20  onchFile;.  int 
2d190 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d1a0 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30    int nTries = 0
2d1b0 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  ;.  struct times
2d1c0 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  pec conchModTime
2d1d0 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20  ;.  .  do {.    
2d1e0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
2d1f0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
2d200 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2d210 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
2d220 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b  e);.    nTries +
2d230 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  +;.    if( rc==S
2d240 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
2d250 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f      /* If the lo
2d260 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29  ck failed (busy)
2d270 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74  :.       * 1st t
2d280 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20  ry: get the mod 
2d290 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  time of the conc
2d2a0 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64  h, wait 0.5s and
2d2b0 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20   try again. .   
2d2c0 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66      * 2nd try: f
2d2d0 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74  ail if the mod t
2d2e0 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68  ime changed or h
2d2f0 6f 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72  ost id is differ
2d300 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20  ent, wait .     
2d310 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30    *           10
2d320 20 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61   sec and try aga
2d330 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20  in.       * 3rd 
2d340 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c  try: break the l
2d350 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  ock unless the m
2d360 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e  od time has chan
2d370 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ged..       */. 
2d380 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
2d390 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20   buf;.      if( 
2d3a0 66 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d  fstat(conchFile-
2d3b0 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
2d3c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
2d3d0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
2d3e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2d3f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
2d400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
2d410 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
2d420 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
2d430 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75  onchModTime = bu
2d440 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a  f.st_mtimespec;.
2d450 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35          usleep(5
2d460 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
2d470 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20  0.5 sec and try 
2d480 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f  the lock again*/
2d490 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
2d4a0 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e;  .      }..  
2d4b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
2d4c0 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66  es>1 );.      if
2d4d0 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74  ( conchModTime.t
2d4e0 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  v_sec != buf.st_
2d4f0 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63  mtimespec.tv_sec
2d500 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f   || .         co
2d510 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73  nchModTime.tv_ns
2d520 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
2d530 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29  mespec.tv_nsec )
2d540 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2d550 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2d560 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
2d570 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32     if( nTries==2
2d580 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68   ){  .        ch
2d590 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41  ar tBuf[PROXY_MA
2d5a0 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
2d5b0 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 70 72      int len = pr
2d5c0 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
2d5d0 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  , tBuf, PROXY_MA
2d5e0 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
2d5f0 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30         if( len<0
2d600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
2d610 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
2d620 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
2d630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d640 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
2d650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2d660 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48  ( len>PROXY_PATH
2d670 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d  INDEX && tBuf[0]
2d680 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  ==(char)PROXY_CO
2d690 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20  NCHVERSION){.   
2d6a0 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
2d6b0 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69  break the lock i
2d6c0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f  f the host id do
2d6d0 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  esn't match */. 
2d6e0 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d           if( 0!=
2d6f0 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f  memcmp(&tBuf[PRO
2d700 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
2d710 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
2d720 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20  OSTIDLEN) ){.   
2d730 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2d740 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2d750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d770 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
2d780 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f   the lock on sho
2d790 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72  rt read or a ver
2d7a0 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f  sion mismatch */
2d7b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2d7c0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
2d7d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d7e0 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30   usleep(10000000
2d7f0 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65  ); /* wait 10 se
2d800 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
2d810 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ck again */.    
2d820 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20      continue; . 
2d830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
2d840 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
2d850 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69  es==3 );.      i
2d860 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b  f( 0==proxyBreak
2d870 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
2d880 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20   myHostID) ){.  
2d890 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d8a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
2d8b0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c  ( lockType==EXCL
2d8c0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
2d8d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
2d8e0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
2d8f0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
2d900 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
2d910 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20   SHARED_LOCK);  
2d920 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2d930 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
2d940 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2d950 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
2d960 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
2d970 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2d980 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
2d990 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2d9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
2d9b0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2d9c0 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73  E_BUSY && nTries
2d9d0 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  <3 );.  .  retur
2d9e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
2d9f0 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
2da00 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
2da10 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
2da20 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
2da30 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
2da40 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
2da50 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
2da60 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
2da70 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
2da80 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
2da90 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
2daa0 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
2dab0 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
2dac0 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
2dad0 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
2dae0 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
2daf0 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
2db00 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
2db10 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
2db20 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
2db30 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2db40 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
2db50 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
2db60 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
2db70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2db80 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2db90 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2dba0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2dbb0 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
2dbc0 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b  >conchHeld!=0 ){
2dbd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2dbe0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2dbf0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
2dc00 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
2dc10 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75  conchFile;.    u
2dc20 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a  uid_t myHostID;.
2dc30 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d      int pError =
2dc40 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61   0;.    char rea
2dc50 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  dBuf[PROXY_MAXCO
2dc60 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
2dc70 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41  r lockPath[MAXPA
2dc80 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  THLEN];.    char
2dc90 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d   *tempLockPath =
2dca0 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
2dcb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2dcc0 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e     int createCon
2dcd0 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
2dce0 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b  hostIdMatch = 0;
2dcf0 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e  .    int readLen
2dd00 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72   = 0;.    int tr
2dd10 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
2dd20 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e  ;.    int forceN
2dd30 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ewLockPath = 0;.
2dd40 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45      .    OSTRACE
2dd50 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
2dd60 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
2dd70 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
2dd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
2dd90 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2dda0 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
2ddb0 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
2ddc0 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29  o:"), getpid()))
2ddd0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ;..    rc = prox
2dde0 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73  yGetHostID(myHos
2ddf0 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20  tID, &pError);. 
2de00 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
2de10 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
2de20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
2de30 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f  astErrno = pErro
2de40 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  r;.      goto en
2de50 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
2de60 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78   }.    rc = prox
2de70 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  yConchLock(pFile
2de80 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52  , myHostID, SHAR
2de90 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
2dea0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2deb0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
2dec0 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
2ded0 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74   }.    /* read t
2dee0 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63  he existing conc
2def0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65  h file */.    re
2df00 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52  adLen = seekAndR
2df10 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63  ead((unixFile*)c
2df20 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61  onchFile, 0, rea
2df30 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  dBuf, PROXY_MAXC
2df40 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66  ONCHLEN);.    if
2df50 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20  ( readLen<0 ){. 
2df60 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f       /* I/O erro
2df70 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  r: lastErrno set
2df80 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
2df90 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  */.      pFile->
2dfa0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63  lastErrno = conc
2dfb0 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  hFile->lastErrno
2dfc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2dfd0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
2dfe0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
2dff0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65  akeconch;.    }e
2e000 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c  lse if( readLen<
2e010 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  =(PROXY_HEADERLE
2e020 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
2e030 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  N) || .         
2e040 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d      readBuf[0]!=
2e050 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
2e060 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20  HVERSION ){.    
2e070 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61    /* a short rea
2e080 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72  d or version for
2e090 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61  mat mismatch mea
2e0a0 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  ns we need to cr
2e0b0 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20  eate a new .    
2e0c0 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e    ** conch file.
2e0d0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
2e0e0 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31   createConch = 1
2e0f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69  ;.    }.    /* i
2e100 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
2e110 74 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f  tches and the lo
2e120 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20  ck path already 
2e130 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f  exists in the co
2e140 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c  nch.    ** we'll
2e150 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
2e160 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77  path there, if w
2e170 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61  e can't open tha
2e180 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20  t path, we'll . 
2e190 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68     ** retry with
2e1a0 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65   a new auto-gene
2e1b0 72 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20  rated path .    
2e1c0 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69  */.    do { /* i
2e1d0 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
2e1e0 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20  o try again for 
2e1f0 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20  an :auto: named 
2e200 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  lock file */..  
2e210 20 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43      if( !createC
2e220 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65  onch && !forceNe
2e230 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  wLockPath ){.   
2e240 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68       hostIdMatch
2e250 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64   = !memcmp(&read
2e260 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
2e270 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
2e280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2a0 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c     PROXY_HOSTIDL
2e2b0 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  EN);.        /* 
2e2c0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73  if the conch has
2e2d0 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68   data compare th
2e2e0 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  e contents */.  
2e2f0 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
2e300 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
2e310 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66  {.          /* f
2e320 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f  or auto-named lo
2e330 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a  cal lock file, j
2e340 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f  ust check the ho
2e350 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a  st ID and we'll.
2e360 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
2e370 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
2e380 20 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27   file path that'
2e390 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2e3a0 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  re.           */
2e3b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68  .          if( h
2e3c0 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20  ostIdMatch ){.  
2e3d0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74            size_t
2e3e0 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64   pathLen = (read
2e3f0 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48  Len - PROXY_PATH
2e400 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20  INDEX);.        
2e410 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
2e420 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41   if( pathLen>=MA
2e430 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20  XPATHLEN ){.    
2e440 20 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65            pathLe
2e450 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a  n=MAXPATHLEN-1;.
2e460 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e470 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2e480 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64  (lockPath, &read
2e490 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
2e4a0 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a  DEX], pathLen);.
2e4b0 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
2e4c0 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20  Path[pathLen] = 
2e4d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  0;.            t
2e4e0 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f  empLockPath = lo
2e4f0 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  ckPath;.        
2e500 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61      tryOldLockPa
2e510 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
2e520 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
2e530 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
2e540 20 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e   path if the con
2e550 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
2e560 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2e570 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
2e580 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73     }else if( hos
2e5a0 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20  tIdMatch.       
2e5b0 20 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e          && !strn
2e5c0 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  cmp(pCtx->lockPr
2e5d0 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75  oxyPath, &readBu
2e5e0 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
2e5f0 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X],.            
2e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2e610 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54  eadLen-PROXY_PAT
2e620 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20  HINDEX).        
2e630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2e640 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c  conch host and l
2e650 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a  ock path match *
2e660 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
2e670 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20   end_takeconch; 
2e680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e690 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2e6a0 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  /* if the conch 
2e6b0 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61  isn't writable a
2e6c0 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  nd doesn't match
2e6d0 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20  , we can't take 
2e6e0 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  it */.      if( 
2e6f0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e  (conchFile->open
2e700 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
2e710 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   0 ){.        rc
2e720 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
2e730 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2e740 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
2e750 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2e760 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63   /* either the c
2e770 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63  onch didn't matc
2e780 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20  h or we need to 
2e790 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
2e7a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
2e7b0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2e7c0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  th ){.        pr
2e7d0 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70  oxyGetLockPath(p
2e7e0 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63  Ctx->dbPath, loc
2e7f0 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  kPath, MAXPATHLE
2e800 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  N);.        temp
2e810 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
2e820 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ath;.        /* 
2e830 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
2e840 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f   the lock path _
2e850 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e  only_ if the con
2e860 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
2e870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
2e880 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f      /* update co
2e890 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e  nch with host an
2e8a0 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c  d path (this wil
2e8b0 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20  l fail if other 
2e8c0 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a  process.      **
2e8d0 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f   has a shared lo
2e8e0 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20  ck already), if 
2e8f0 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
2e900 68 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67  hes, use the big
2e910 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e  .      ** stick.
2e920 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e930 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c  futimes(conchFil
2e940 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  e->h, NULL);.   
2e950 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
2e960 63 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e  ch && !createCon
2e970 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ch ){.        if
2e980 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e  ( conchFile->pIn
2e990 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65  ode && conchFile
2e9a0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
2e9b0 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>1 ){.         
2e9c0 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
2e9d0 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
2e9e0 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
2e9f0 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
2ea00 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  is.           **
2ea10 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
2ea20 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
2ea30 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
2ea40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2ea50 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2ea60 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20       } else {   
2ea70 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2ea80 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
2ea90 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
2eaa0 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45  ostID, EXCLUSIVE
2eab0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2eac0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2ead0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
2eae0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2eaf0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
2eb00 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
2eb10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
2eb20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2eb30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2eb40 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
2eb50 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f   writeBuffer[PRO
2eb60 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
2eb70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69  .        int wri
2eb80 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  teSize = 0;.    
2eb90 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69      .        wri
2eba0 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63  teBuffer[0] = (c
2ebb0 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
2ebc0 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  ERSION;.        
2ebd0 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66  memcpy(&writeBuf
2ebe0 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  fer[PROXY_HEADER
2ebf0 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
2ec00 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2ec10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
2ec20 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2ec30 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  h!=NULL ){.     
2ec40 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
2ec50 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2ec60 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78  PATHINDEX], pCtx
2ec70 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
2ec80 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2ec90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2eca0 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
2ecb0 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
2ecc0 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65  Y_PATHINDEX], te
2ecd0 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  mpLockPath, MAXP
2ece0 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
2ecf0 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65   }.        write
2ed00 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54  Size = PROXY_PAT
2ed10 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28  HINDEX + strlen(
2ed20 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
2ed30 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a  XY_PATHINDEX]);.
2ed40 20 20 20 20 20 20 20 20 66 74 72 75 6e 63 61 74          ftruncat
2ed50 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  e(conchFile->h, 
2ed60 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20  writeSize);.    
2ed70 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
2ed80 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
2ed90 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72   *)conchFile, wr
2eda0 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65  iteBuffer, write
2edb0 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
2edc0 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c    fsync(conchFil
2edd0 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f  e->h);.        /
2ede0 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
2edf0 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65  a new conch file
2ee00 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74   (not just updat
2ee10 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ed the contents 
2ee20 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a  of a .         *
2ee30 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69  * valid conch fi
2ee40 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63  le), try to matc
2ee50 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
2ee60 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
2ee70 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  e .         */. 
2ee80 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2ee90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61  QLITE_OK && crea
2eea0 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
2eeb0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
2eec0 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
2eed0 69 6e 74 20 65 72 72 20 3d 20 66 73 74 61 74 28  int err = fstat(
2eee0 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b  pFile->h, &buf);
2eef0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2ef00 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
2ef10 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64       mode_t cmod
2ef20 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26  e = buf.st_mode&
2ef30 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52  (S_IRUSR|S_IWUSR
2ef40 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47   | S_IRGRP|S_IWG
2ef50 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  RP |.           
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49               S_I
2ef80 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20  ROTH|S_IWOTH);. 
2ef90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
2efa0 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 64  y to match the d
2efb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f 57  atabase file R/W
2efc0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67   permissions, ig
2efd0 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a  nore failure */.
2efe0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50  #ifndef SQLITE_P
2eff0 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20  ROXY_DEBUG.     
2f000 20 20 20 20 20 20 20 66 63 68 6d 6f 64 28 63 6f         fchmod(co
2f010 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64  nchFile->h, cmod
2f020 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  e);.#else.      
2f030 20 20 20 20 20 20 69 66 28 20 66 63 68 6d 6f 64        if( fchmod
2f040 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
2f050 6d 6f 64 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  mode)!=0 ){.    
2f060 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
2f070 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  de = errno;.    
2f080 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
2f090 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f  f(stderr, "fchmo
2f0a0 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68  d %o FAILED with
2f0b0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0d0 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74   cmode, code, st
2f0e0 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20  rerror(code));. 
2f0f0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2f100 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
2f110 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2f120 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43  , "fchmod %o SUC
2f130 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b  CEDED\n",cmode);
2f140 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2f150 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f160 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2f170 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  code = errno;.  
2f180 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
2f190 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20  f(stderr, "STAT 
2f1a0 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20  FAILED[%d] with 
2f1b0 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  %d %s\n", .     
2f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2f1d0 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  rr, code, strerr
2f1e0 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69  or(code));.#endi
2f1f0 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  f.          }.  
2f200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f210 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
2f220 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
2f230 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2f240 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
2f250 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2f260 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  .    end_takecon
2f270 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ch:.      OSTRAC
2f280 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E(("TRANSPROXY: 
2f290 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46  CLOSE  %d\n", pF
2f2a0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
2f2b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f2c0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  K && pFile->open
2f2d0 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20  Flags ){.       
2f2e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
2f2f0 20 29 7b 0a 23 69 66 64 65 66 20 53 54 52 49 43   ){.#ifdef STRIC
2f300 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20  T_CLOSE_ERROR.  
2f310 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
2f320 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  e(pFile->h) ){. 
2f330 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
2f340 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2f350 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
2f360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2f370 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  OERR_CLOSE;.    
2f380 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
2f390 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46          close(pF
2f3a0 69 6c 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65  ile->h); /* sile
2f3b0 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20  ntly leak fd if 
2f3c0 66 61 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  fail */.#endif. 
2f3d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f3e0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
2f3f0 20 20 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d          int fd =
2f400 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61   open(pCtx->dbPa
2f410 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46  th, pFile->openF
2f420 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
2f430 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2f440 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2f450 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2f460 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
2f470 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e  TRANSPROXY: OPEN
2f480 20 20 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20    %d\n", fd));. 
2f490 20 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30         if( fd>=0
2f4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
2f4b0 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20  ile->h = fd;.   
2f4c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f4d0 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f        rc=SQLITE_
2f4e0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f  CANTOPEN_BKPT; /
2f4f0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70  * SQLITE_BUSY? p
2f500 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61  roxyTakeConch ca
2f510 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  lled.           
2f520 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a  during locking *
2f530 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
2f540 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2f550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2f560 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20  pCtx->lockProxy 
2f570 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2f580 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b  *path = tempLock
2f590 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50  Path ? tempLockP
2f5a0 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath : pCtx->lock
2f5b0 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20  ProxyPath;.     
2f5c0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65     rc = proxyCre
2f5d0 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68  ateUnixFile(path
2f5e0 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  , &pCtx->lockPro
2f5f0 78 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  xy, 1);.        
2f600 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f610 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
2f620 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c  NOMEM && tryOldL
2f630 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
2f640 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64       /* we could
2f650 6e 27 74 20 63 72 65 61 74 65 20 74 68 65 20 70  n't create the p
2f660 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77  roxy lock file w
2f670 69 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b  ith the old lock
2f680 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20   file path.     
2f690 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20        ** so try 
2f6a0 61 67 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e  again via auto-n
2f6b0 61 6d 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20  aming .         
2f6c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66    */.          f
2f6d0 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
2f6e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2f6f0 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20  ryOldLockPath = 
2f700 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0;.          con
2f710 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63  tinue; /* go bac
2f720 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77  k to the do {} w
2f730 68 69 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74  hile start point
2f740 2c 20 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20  , try again */. 
2f750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f760 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2f770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f780 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
2f790 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61  ake a copy of pa
2f7a0 74 68 20 69 66 20 77 65 20 65 78 74 72 61 63 74  th if we extract
2f7b0 65 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  ed the value.   
2f7c0 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
2f7d0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20  e conch file or 
2f7e0 74 68 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c  the path was all
2f7f0 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74  ocated on the st
2f800 61 63 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  ack.         */.
2f810 20 20 20 20 20 20 20 20 69 66 28 20 74 65 6d 70          if( temp
2f820 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
2f830 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
2f840 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
2f850 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 74  te3DbStrDup(0, t
2f860 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  empLockPath);.  
2f870 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74          if( !pCt
2f880 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2f890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f8a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2f8b0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
2f8c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f8d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2f8e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f8f0 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
2f900 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  eld = 1;.       
2f910 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43   .        if( pC
2f920 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  tx->lockProxy->p
2f930 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f  Method == &afpIo
2f940 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
2f950 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43       afpLockingC
2f960 6f 6e 74 65 78 74 20 2a 61 66 70 43 74 78 3b 0a  ontext *afpCtx;.
2f970 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78            afpCtx
2f980 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
2f990 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f  ntext *)pCtx->lo
2f9a0 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67  ckProxy->locking
2f9b0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20  Context;.       
2f9c0 20 20 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74     afpCtx->dbPat
2f9d0 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h = pCtx->lockPr
2f9e0 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
2f9f0 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20   }.      } else 
2fa00 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 46  {.        conchF
2fa10 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
2fa20 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
2fa30 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
2fa40 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
2fa50 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
2fa60 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
2fa70 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %s\n", conchFile
2fa80 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
2fa90 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
2faa0 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29  K?"ok":"failed")
2fab0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2fac0 72 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20  rc;.    } while 
2fad0 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20  (1); /* in case 
2fae0 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 72 79  we need to retry
2faf0 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b   the :auto: lock
2fb00 20 66 69 6c 65 20 2d 20 0a 20 20 20 20 20 20 20   file - .       
2fb10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20            ** we 
2fb20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74  should never get
2fb30 20 68 65 72 65 20 65 78 63 65 70 74 20 76 69 61   here except via
2fb40 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20   the 'continue' 
2fb50 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a  call. */.  }.}..
2fb60 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68  /*.** If pFile h
2fb70 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  olds a lock on a
2fb80 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65   conch file, the
2fb90 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c  n release that l
2fba0 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
2fbb0 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43  nt proxyReleaseC
2fbc0 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  onch(unixFile *p
2fbd0 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  File){.  int rc 
2fbe0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2fbf0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
2fc00 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ne return code *
2fc10 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  /.  proxyLocking
2fc20 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20  Context *pCtx;  
2fc30 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63  /* The locking c
2fc40 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 70  ontext for the p
2fc50 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  roxy lock */.  u
2fc60 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
2fc70 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  le;        /* Na
2fc80 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20  me of the conch 
2fc90 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20  file */..  pCtx 
2fca0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
2fcb0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
2fcc0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
2fcd0 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43    conchFile = pC
2fce0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
2fcf0 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41   OSTRACE(("RELEA
2fd00 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20  SECONCH  %d for 
2fd10 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f  %s pid=%d\n", co
2fd20 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
2fd30 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
2fd40 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
2fd50 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2fd60 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a  h : ":auto:"), .
2fd70 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
2fd80 64 28 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74  d()));.  if( pCt
2fd90 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
2fda0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
2fdb0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2fdc0 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
2fdd0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
2fde0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
2fdf0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2fe00 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28   = 0;.  OSTRACE(
2fe10 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20  ("RELEASECONCH  
2fe20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
2fe30 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
2fe40 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f     (rc==SQLITE_O
2fe50 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
2fe60 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  ed")));.  return
2fe70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
2fe80 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2fe90 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
2fea0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d   compute the nam
2feb0 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66  e of its conch f
2fec0 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68  ile..** Store th
2fed0 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65  e conch filename
2fee0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
2fef0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2ff00 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61  _malloc()..** Ma
2ff10 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70  ke *pConchPath p
2ff20 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
2ff30 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51  name.  Return SQ
2ff40 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
2ff50 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ss.** or SQLITE_
2ff60 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20  NOMEM if unable 
2ff70 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79  to obtain memory
2ff80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2ff90 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
2ffa0 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
2ffb0 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  hat the allocate
2ffc0 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  d memory.** spac
2ffd0 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  e is eventually 
2ffe0 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43  freed..**.** *pC
2fff0 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20  onchPath is set 
30000 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d  to NULL if a mem
30010 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
30020 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
30030 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
30040 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
30050 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68  ame(char *dbPath
30060 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50  , char **pConchP
30070 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ath){.  int i;  
30080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30090 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
300a0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c  unter */.  int l
300b0 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
300c0 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e  (dbPath); /* Len
300d0 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  gth of database 
300e0 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74  filename - dbPat
300f0 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  h */.  char *con
30100 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  chPath;         
30110 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69       /* buffer i
30120 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74  n which to const
30130 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20  ruct conch name 
30140 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
30150 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
30160 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61  conch filename a
30170 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
30180 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74  e name to.  ** t
30190 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f  he name of the o
301a0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
301b0 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70   file. */  .  *p
301c0 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63  ConchPath = conc
301d0 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29  hPath = (char *)
301e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c  sqlite3_malloc(l
301f0 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63  en + 8);.  if( c
30200 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20  onchPath==0 ){. 
30210 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30220 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
30230 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20  mcpy(conchPath, 
30240 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a  dbPath, len+1);.
30250 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65    .  /* now inse
30260 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20  rt a "." before 
30270 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61  the last / chara
30280 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69  cter */.  for( i
30290 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20  =(len-1); i>=0; 
302a0 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63  i-- ){.    if( c
302b0 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27  onchPath[i]=='/'
302c0 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
302d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
302e0 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74  }.  }.  conchPat
302f0 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c  h[i]='.';.  whil
30300 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20  e ( i<len ){.   
30310 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d   conchPath[i+1]=
30320 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69  dbPath[i];.    i
30330 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70  ++;.  }..  /* ap
30340 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68  pend the "-conch
30350 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20  " suffix to the 
30360 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  file */.  memcpy
30370 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d  (&conchPath[i+1]
30380 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a  , "-conch", 7);.
30390 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
303a0 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29  trlen(conchPath)
303b0 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20   == len+7 );..  
303c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
303d0 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61  ;.}.../* Takes a
303e0 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65   fully configure
303f0 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d  d proxy locking-
30400 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20  style unix file 
30410 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20  and switches.** 
30420 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
30430 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61  ile path .*/.sta
30440 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f  tic int switchLo
30450 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78  ckProxyPath(unix
30460 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e  File *pFile, con
30470 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b  st char *path) {
30480 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
30490 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
304a0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
304b0 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
304c0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68  ingContext;.  ch
304d0 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43  ar *oldPath = pC
304e0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
304f0 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  h;.  int rc = SQ
30500 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
30510 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
30520 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
30530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
30540 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a  USY;.  }  ..  /*
30550 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69   nothing to do i
30560 66 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55  f the path is NU
30570 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61  LL, :auto: or ma
30580 74 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69  tches the existi
30590 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28  ng path */.  if(
305a0 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30   !path || path[0
305b0 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63  ]=='\0' || !strc
305c0 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a  mp(path, ":auto:
305d0 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61  ") ||.    (oldPa
305e0 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f  th && !strncmp(o
305f0 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41  ldPath, path, MA
30600 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20  XPATHLEN)) ){.  
30610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30620 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
30630 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
30640 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
30650 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78  kProxy;.    pCtx
30660 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c  ->lockProxy=NULL
30670 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63  ;.    pCtx->conc
30680 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69  hHeld = 0;.    i
30690 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55  f( lockProxy!=NU
306a0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  LL ){.      rc=l
306b0 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
306c0 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
306d0 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72  e3_file *)lockPr
306e0 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oxy);.      if( 
306f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
30700 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
30710 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  ee(lockProxy);. 
30720 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
30730 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a  _free(oldPath);.
30740 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
30750 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
30760 33 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74  3DbStrDup(0, pat
30770 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74  h);.  }.  .  ret
30780 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30790 20 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65   pFile is a file
307a0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
307b0 70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72  pened by a prior
307c0 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62   xOpen call.  db
307d0 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72  Path.** is a str
307e0 69 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65  ing buffer at le
307f0 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31  ast MAXPATHLEN+1
30800 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73   characters in s
30810 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
30820 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65  routine find the
30830 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69   filename associ
30840 61 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20  ated with pFile 
30850 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a  and writes it.**
30860 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a   int dbPath..*/.
30870 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
30880 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
30890 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
308a0 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
308b0 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  th){.#if defined
308c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66  (__APPLE__).  if
308d0 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
308e0 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
308f0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20  s ){.    /* afp 
30900 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65  style keeps a re
30910 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64  ference to the d
30920 62 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69  b path in the fi
30930 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20  lePath field .  
30940 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75    ** of the stru
30950 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ct */.    assert
30960 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63  ( (int)strlen((c
30970 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
30980 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58  ingContext)<=MAX
30990 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73  PATHLEN );.    s
309a0 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28  trlcpy(dbPath, (
309b0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
309c0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
309d0 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50  ingContext)->dbP
309e0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
309f0 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69  ;.  } else.#endi
30a00 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  f.  if( pFile->p
30a10 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f  Method == &dotlo
30a20 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
30a30 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73     /* dot lock s
30a40 74 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f  tyle uses the lo
30a50 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f  cking context to
30a60 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c   store the dot l
30a70 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ock.    ** file 
30a80 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  path */.    int 
30a90 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68  len = strlen((ch
30aa0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
30ab0 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74  ingContext) - st
30ac0 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46  rlen(DOTLOCK_SUF
30ad0 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  FIX);.    memcpy
30ae0 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a  (dbPath, (char *
30af0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
30b00 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29  ontext, len + 1)
30b10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
30b20 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c  * all other styl
30b30 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69  es use the locki
30b40 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74  ng context to st
30b50 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ore the db file 
30b60 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65  path */.    asse
30b70 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72  rt( strlen((char
30b80 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
30b90 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54  Context)<=MAXPAT
30ba0 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c  HLEN );.    strl
30bb0 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61  cpy(dbPath, (cha
30bc0 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
30bd0 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41  ngContext, MAXPA
30be0 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65  THLEN);.  }.  re
30bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30c00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61  }../*.** Takes a
30c10 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64  n already filled
30c20 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e   in unix file an
30c30 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61  d alters it so a
30c40 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ll file locking 
30c50 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66  .** will be perf
30c60 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63  ormed on the loc
30c70 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  al proxy lock fi
30c80 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  le.  The followi
30c90 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65  ng fields.** are
30ca0 20 70 72 65 73 65 72 76 65 64 20 69 6e 20 74 68   preserved in th
30cb0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
30cc0 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  t so that they c
30cd0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  an be restored a
30ce0 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20  nd .** the unix 
30cf0 73 74 72 75 63 74 75 72 65 20 70 72 6f 70 65 72  structure proper
30d00 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74  ly cleaned up at
30d10 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20   close time:.** 
30d20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78   ->lockingContex
30d30 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a  t.**  ->pMethod.
30d40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
30d50 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
30d60 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
30d70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
30d80 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
30d90 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
30da0 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62  *pCtx;.  char db
30db0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b  Path[MAXPATHLEN+
30dc0 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  1];       /* Nam
30dd0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
30de0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
30df0 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b   *lockPath=NULL;
30e00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30e10 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
30e20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
30e30 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
30e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
30e50 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79  USY;.  }.  proxy
30e60 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
30e70 46 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61  File(pFile, dbPa
30e80 74 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68  th);.  if( !path
30e90 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30   || path[0]=='\0
30ea0 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74  ' || !strcmp(pat
30eb0 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a  h, ":auto:") ){.
30ec0 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c      lockPath=NUL
30ed0 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
30ee0 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a  lockPath=(char *
30ef0 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20  )path;.  }.  .  
30f00 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
30f10 52 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73 20  ROXY  %d for %s 
30f20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
30f30 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
30f40 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b  (lockPath ? lock
30f50 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
30f60 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
30f70 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
30f80 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
30f90 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70  pCtx) );.  if( p
30fa0 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Ctx==0 ){.    re
30fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
30fc0 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
30fd0 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCtx, 0, sizeof(
30fe0 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d  *pCtx));..  rc =
30ff0 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
31000 68 50 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68  hPathname(dbPath
31010 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  , &pCtx->conchFi
31020 6c 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72  lePath);.  if( r
31030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31040 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
31050 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74  eateUnixFile(pCt
31060 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
31070 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  , &pCtx->conchFi
31080 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  le, 0);.    if( 
31090 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
310a0 50 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e  PEN && ((pFile->
310b0 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52  openFlags&O_RDWR
310c0 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20  ) == 0) ){.     
310d0 20 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f   /* if (a) the o
310e0 70 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f  pen flags are no
310f0 74 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68  t O_RDWR, (b) th
31100 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68  e conch isn't th
31110 65 72 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  ere, and.      *
31120 2a 20 28 63 29 20 74 68 65 20 66 69 6c 65 20 73  * (c) the file s
31130 79 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e  ystem is read-on
31140 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20  ly, then enable 
31150 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73  no-locking acces
31160 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c  s..      ** Ugh,
31170 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d   since O_RDONLY=
31180 3d 30 78 30 30 30 30 20 77 65 20 74 65 73 74 20  =0x0000 we test 
31190 66 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63  for !O_RDWR sinc
311a0 65 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72  e unixOpen asser
311b0 74 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ts.      ** that
311c0 20 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20   openFlags will 
311d0 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66  have only one of
311e0 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52   O_RDONLY or O_R
311f0 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  DWR..      */.  
31200 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 66      struct statf
31210 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  s fsInfo;.      
31220 73 74 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63  struct stat conc
31230 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74  hInfo;.      int
31240 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b   goLockless = 0;
31250 0a 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74  ..      if( stat
31260 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
31270 50 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f  Path, &conchInfo
31280 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20  ) == -1 ) {.    
31290 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
312a0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rno;.        if(
312b0 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26   (err==ENOENT) &
312c0 26 20 28 73 74 61 74 66 73 28 64 62 50 61 74 68  & (statfs(dbPath
312d0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
312e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
312f0 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49  oLockless = (fsI
31300 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
31310 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52  RDONLY) == MNT_R
31320 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d  DONLY;.        }
31330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31340 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b  f( goLockless ){
31350 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63  .        pCtx->c
31360 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f  onchHeld = -1; /
31370 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20  * read only FS/ 
31380 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
31390 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
313a0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
313b0 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63  }.  }  .  if( rc
313c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c  ==SQLITE_OK && l
313d0 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70  ockPath ){.    p
313e0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
313f0 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
31400 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68  rDup(0, lockPath
31410 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
31420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31430 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
31440 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
31450 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  p(0, dbPath);.  
31460 20 20 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61    if( pCtx->dbPa
31470 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  th==NULL ){.    
31480 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
31490 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
314a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
314b0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c  OK ){.    /* all
314c0 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63   memory is alloc
314d0 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65  ated, proxys are
314e0 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 73 73   created and ass
314f0 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73  igned, .    ** s
31500 77 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e  witch the lockin
31510 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d  g context and pM
31520 65 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72  ethod then retur
31530 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  n..    */.    pC
31540 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
31550 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c  ntext = pFile->l
31560 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
31570 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
31580 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b  gContext = pCtx;
31590 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d  .    pCtx->pOldM
315a0 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70  ethod = pFile->p
315b0 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c  Method;.    pFil
315c0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72  e->pMethod = &pr
315d0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  oxyIoMethods;.  
315e0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
315f0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29  Ctx->conchFile )
31600 7b 20 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63  { .      pCtx->c
31610 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
31620 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
31630 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e  e3_file *)pCtx->
31640 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
31650 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31660 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b  Ctx->conchFile);
31670 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
31680 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78  e3DbFree(0, pCtx
31690 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29  ->lockProxyPath)
316a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
316b0 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
316c0 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71  lePath); .    sq
316d0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29  lite3_free(pCtx)
316e0 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
316f0 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64  ("TRANSPROXY  %d
31700 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
31710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  ,.           (rc
31720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
31730 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29  k" : "failed")))
31740 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
31750 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
31760 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71  utine handles sq
31770 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
31780 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  ol() calls that 
31790 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20  are specific.** 
317a0 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  to proxy locking
317b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
317c0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
317d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
317e0 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
317f0 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68  *pArg){.  switch
31800 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
31810 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
31820 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
31830 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
31840 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
31850 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  id;.      if( pF
31860 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
31870 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20  &proxyIoMethods 
31880 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
31890 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
318a0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
318b0 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
318c0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
318d0 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78  xt;.        prox
318e0 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
318f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31900 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
31910 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
31920 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
31930 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  pArg = pCtx->loc
31940 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
31950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31960 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61       *(const cha
31970 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75  r **)pArg = ":au
31980 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b  to: (not held)";
31990 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
319a0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
319b0 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
319c0 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20  *)pArg = NULL;. 
319d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
319e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
319f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
31a00 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
31a10 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
31a20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
31a30 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
31a40 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
31a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
31a60 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c   int isProxyStyl
31a70 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74  e = (pFile->pMet
31a80 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
31a90 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69  ethods);.      i
31aa0 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c  f( pArg==NULL ||
31ab0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
31ac0 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
31ad0 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
31ae0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
31af0 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78  /* turn off prox
31b00 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20  y locking - not 
31b10 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20  supported */.   
31b20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31b30 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54  TE_ERROR /*SQLIT
31b40 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49  E_PROTOCOL? SQLI
31b50 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20  TE_MISUSE?*/;.  
31b60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31b70 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
31b80 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
31b90 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d   - already off -
31ba0 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20   NOOP */.       
31bb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
31bc0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
31bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31be0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72    const char *pr
31bf0 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74  oxyPath = (const
31c00 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20   char *)pArg;.  
31c10 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78        if( isProx
31c20 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20  yStyle ){.      
31c30 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
31c40 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
31c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 72  .            (pr
31c60 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
31c70 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
31c80 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
31c90 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
31ca0 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20  pArg, ":auto:") 
31cb0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
31cc0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
31cd0 61 74 68 20 26 26 0a 20 20 20 20 20 20 20 20 20  ath &&.         
31ce0 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70        !strncmp(p
31cf0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
31d00 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d  th, proxyPath, M
31d10 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20  AXPATHLEN)).    
31d20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
31d30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31d40 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
31d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31d60 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63    rc = switchLoc
31d70 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65  kProxyPath(pFile
31d80 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
31d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31db0 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72     /* turn on pr
31dc0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
31dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
31de0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
31df0 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c  mUnixFile(pFile,
31e00 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
31e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31e20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31e30 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
31e40 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
31e50 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  t( 0 );  /* The 
31e60 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61  call assures tha
31e70 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63  t only valid opc
31e80 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f  odes are sent */
31e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
31ea0 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65  OTREACHED*/.  re
31eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
31ec0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68  R;.}../*.** With
31ed0 69 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  in this division
31ee0 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c   (the proxying l
31ef0 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
31f00 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65  ation) the proce
31f10 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74  dures.** above t
31f20 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c  his point are al
31f30 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68  l utilities.  Th
31f40 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d  e lock-related m
31f50 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a  ethods of the.**
31f60 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73   proxy-locking s
31f70 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
31f80 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a   object follow..
31f90 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  */.../*.** This 
31fa0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
31fb0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
31fc0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
31fd0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
31fe0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
31ff0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
32000 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
32010 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
32020 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
32030 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
32040 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
32050 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
32060 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
32070 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
32080 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
32090 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
320a0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
320b0 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
320c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
320d0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
320e0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
320f0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
32100 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  Out) {.  unixFil
32110 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
32120 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
32130 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
32140 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
32150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32160 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
32170 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
32180 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
32190 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
321a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
321b0 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
321c0 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
321d0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
321e0 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
321f0 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74  Proxy;.      ret
32200 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  urn proxy->pMeth
32210 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76  od->xCheckReserv
32220 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  edLock((sqlite3_
32230 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65  file*)proxy, pRe
32240 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sOut);.    }else
32250 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c  { /* conchHeld <
32260 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a   0 is lockless *
32270 2f 0a 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d  /.      pResOut=
32280 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
32290 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
322a0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
322b0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
322c0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
322d0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
322e0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
322f0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
32300 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
32310 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
32320 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
32330 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
32340 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
32350 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
32360 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
32370 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
32380 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
32390 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
323a0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
323b0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
323c0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
323d0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
323e0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
323f0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
32400 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
32410 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
32420 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
32430 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
32440 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
32450 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
32460 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
32470 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
32480 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
32490 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
324a0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
324b0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
324c0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
324d0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
324e0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
324f0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
32500 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
32510 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
32520 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
32530 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
32540 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
32550 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
32560 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
32570 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
32580 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
32590 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
325a0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
325b0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
325c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
325d0 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  yLock(sqlite3_fi
325e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
325f0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
32600 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
32610 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
32620 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
32630 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
32640 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32650 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
32660 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
32670 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
32680 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
32690 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
326a0 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
326b0 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
326c0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
326d0 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
326e0 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
326f0 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  c = proxy->pMeth
32700 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
32710 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20  e3_file*)proxy, 
32720 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  eFileLock);.    
32730 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
32740 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c  ck = proxy->eFil
32750 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  eLock;.    }else
32760 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68  {.      /* conch
32770 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b  Held < 0 is lock
32780 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  less */.    }.  
32790 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
327a0 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  .../*.** Lower t
327b0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
327c0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
327d0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
327e0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
327f0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
32800 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
32810 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
32820 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
32830 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
32840 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
32850 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
32860 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
32870 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
32880 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
32890 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
328a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
328b0 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
328c0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
328d0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
328e0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
328f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
32900 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
32910 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
32920 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
32930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
32940 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
32950 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
32960 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
32970 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
32980 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  text;.    if( pC
32990 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
329a0 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  ){.      unixFil
329b0 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d  e *proxy = pCtx-
329c0 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
329d0 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d    rc = proxy->pM
329e0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
329f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
32a00 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b  oxy, eFileLock);
32a10 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
32a20 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d  ileLock = proxy-
32a30 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
32a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
32a50 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
32a60 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
32a70 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
32a80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
32a90 73 65 20 61 20 66 69 6c 65 20 74 68 61 74 20 75  se a file that u
32aa0 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e  ses proxy locks.
32ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
32ac0 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
32ad0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
32ae0 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
32af0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
32b00 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
32b10 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
32b20 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
32b30 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
32b40 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
32b50 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
32b60 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
32b70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
32b80 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78  kProxy;.    unix
32b90 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
32ba0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
32bb0 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e;.    int rc = 
32bc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a  SQLITE_OK;.    .
32bd0 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78      if( lockProx
32be0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
32bf0 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
32c00 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
32c10 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
32c20 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  roxy, NO_LOCK);.
32c30 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
32c40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
32c50 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e  rc = lockProxy->
32c60 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
32c70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
32c80 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
32c90 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
32ca0 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
32cb0 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78  e3_free(lockProx
32cc0 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  y);.      pCtx->
32cd0 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20  lockProxy = 0;. 
32ce0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e     }.    if( con
32cf0 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  chFile ){.      
32d00 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
32d10 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  eld ){.        r
32d20 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65  c = proxyRelease
32d30 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
32d40 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
32d50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
32d60 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e  }.      rc = con
32d70 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
32d80 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
32d90 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
32da0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
32db0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
32dc0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
32dd0 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
32de0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
32df0 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63  ree(0, pCtx->loc
32e00 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20  kProxyPath);.   
32e10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
32e20 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
32e30 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  h);.    sqlite3D
32e40 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64  bFree(0, pCtx->d
32e50 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72  bPath);.    /* r
32e60 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69  estore the origi
32e70 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  nal locking cont
32e80 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20  ext and pMethod 
32e90 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f  then close it */
32ea0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
32eb0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
32ec0 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  x->oldLockingCon
32ed0 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d  text;.    pFile-
32ee0 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d  >pMethod = pCtx-
32ef0 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20  >pOldMethod;.   
32f00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
32f10 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tx);.    return 
32f20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
32f30 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a  xClose(id);.  }.
32f40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32f50 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20  OK;.}....#endif 
32f60 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
32f70 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
32f80 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
32f90 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
32fa0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
32fb0 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65  style is intende
32fc0 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 41  d for use with A
32fd0 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a  FP filesystems..
32fe0 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50  ** And since AFP
32ff0 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
33000 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68  ed on MacOSX, th
33010 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
33020 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72  is also.** restr
33030 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e  icted to MacOSX.
33040 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .** .**.********
33050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
33060 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
33070 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
33080 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
33090 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
330a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330e0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ******/../*.** I
330f0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
33100 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
33110 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
33120 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67  This routine reg
33130 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69  isters all VFS i
33140 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
33150 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65  or unix-like ope
33160 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d  rating.** system
33170 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
33180 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  , and the sqlite
33190 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69  3_os_end() routi
331a0 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c  ne that follows,
331b0 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68  .** should be th
331c0 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20  e only routines 
331d0 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68 61  in this file tha
331e0 74 20 61 72 65 20 76 69 73 69 62 6c 65 20 66 72  t are visible fr
331f0 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65  om other.** file
33200 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
33210 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
33220 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69  once during SQLi
33230 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  te initializatio
33240 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69  n and by a.** si
33250 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68  ngle thread.  Th
33260 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
33270 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75  ion and mutex su
33280 62 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f  bsystems have no
33290 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79  t.** necessarily
332a0 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
332b0 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  d when this rout
332c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61  ine is called, a
332d0 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68  nd so they.** sh
332e0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64  ould not be used
332f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33300 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20  _os_init(void){ 
33310 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20  .  /* .  ** The 
33320 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20  following macro 
33330 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69  defines an initi
33340 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71  alizer for an sq
33350 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
33360 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20  ..  ** The name 
33370 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e 41  of the VFS is NA
33380 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  ME.  The pAppDat
33390 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  a is a pointer t
333a0 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  o a pointer.  **
333b0 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22   to the "finder"
333c0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70   function.  (pAp
333d0 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74  pData is a point
333e0 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  er to a pointer 
333f0 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c  because.  ** sil
33400 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f  ly C90 rules pro
33410 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72  hibit a void* fr
33420 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f  om being cast to
33430 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
33440 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20  ter.  ** and so 
33450 77 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68  we have to go th
33460 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d  rough the interm
33470 65 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74  ediate pointer t
33480 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
33490 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69  .  ** when compi
334a0 6c 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e  ling with -pedan
334b0 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43  tic-errors on GC
334c0 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  C.).  **.  ** Th
334d0 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74  e FINDER paramet
334e0 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  er to this macro
334f0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
33500 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  the pointer to t
33510 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66  he.  ** finder-f
33520 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69  unction.  The fi
33530 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65  nder-function re
33540 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
33550 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  to the.  ** sqli
33560 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  te_io_methods ob
33570 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
33580 65 6e 74 73 20 74 68 65 20 64 65 73 69 72 65 64  ents the desired
33590 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65   locking.  ** be
335a0 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68  haviors.  See th
335b0 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65  e division above
335c0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
335d0 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a  he IOMETHODS.  *
335e0 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69  * macro for addi
335f0 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
33600 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   on finder-funct
33610 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ions..  **.  ** 
33620 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d  Most finders sim
33630 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ply return a poi
33640 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
33650 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
33660 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20  ds.  ** object. 
33670 20 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f   But the "autolo
33680 63 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69  ckIoFinder" avai
33690 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
336a0 64 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20  does a little.  
336b0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61  ** more than tha
336c0 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74  t; it looks at t
336d0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79  he filesystem ty
336e0 70 65 20 74 68 61 74 20 68 6f 73 74 73 20 74 68  pe that hosts th
336f0 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
33700 20 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20   file and tries 
33710 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63  to choose an loc
33720 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72  king method appr
33730 6f 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a  opriate for.  **
33740 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d   that filesystem
33750 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64   time..  */.  #d
33760 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46  efine UNIXVFS(VF
33770 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b  SNAME, FINDER) {
33780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33790 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 32 2c          \.    2,
337a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337b0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
337c0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
337d0 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65        \.    size
337e0 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20  of(unixFile),   
337f0 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
33800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33810 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41      \.    MAX_PA
33820 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20  THNAME,         
33830 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
33840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33850 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20    \.    0,      
33860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33870 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20   pNext */       
33880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33890 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20  \.    VFSNAME,  
338a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
338b0 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Name */         
338c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
338d0 20 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44      (void*)&FIND
338e0 45 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70  ER,       /* pAp
338f0 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20  pData */        
33900 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
33910 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20    unixOpen,     
33920 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
33930 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
33940 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
33950 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20  unixDelete,     
33960 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
33970 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
33980 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
33990 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  ixAccess,       
339a0 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
339b0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
339c0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
339d0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
339e0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
339f0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
33a00 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
33a10 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
33a20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20  /* xDlOpen */   
33a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a40 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72    \.    unixDlEr
33a50 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
33a60 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20   xDlError */    
33a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a80 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c  \.    unixDlSym,
33a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33aa0 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20  DlSym */        
33ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
33ac0 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c      unixDlClose,
33ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
33ae0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
33af0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
33b00 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73    unixRandomness
33b10 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
33b20 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20  omness */       
33b30 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
33b40 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20  unixSleep,      
33b50 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
33b60 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
33b70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
33b80 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  ixCurrentTime,  
33b90 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
33ba0 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ime */          
33bb0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
33bc0 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
33bd0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
33be0 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  or */           
33bf0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
33c00 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
33c10 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
33c20 6e 74 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20  nt64 */         
33c30 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    \.  }..  /*.  
33c40 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56  ** All default V
33c50 46 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72  FSes for unix ar
33c60 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
33c70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
33c80 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ay..  **.  ** No
33c90 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  te that the sqli
33ca0 74 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69  te3_vfs.pNext fi
33cb0 65 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f  eld of the VFS o
33cc0 62 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65  bject is modifie
33cd0 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51  d.  ** by the SQ
33ce0 4c 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74  Lite core when t
33cf0 68 65 20 56 46 53 20 69 73 20 72 65 67 69 73 74  he VFS is regist
33d00 65 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f  ered.  So the fo
33d10 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72  llowing.  ** arr
33d20 61 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  ay cannot be con
33d30 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  st..  */.  stati
33d40 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56  c sqlite3_vfs aV
33d50 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c  fs[] = {.#if SQL
33d60 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33d70 4e 47 5f 53 54 59 4c 45 20 26 26 20 28 4f 53 5f  NG_STYLE && (OS_
33d80 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e  VXWORKS || defin
33d90 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20  ed(__APPLE__)). 
33da0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
33db0 22 2c 20 20 20 20 20 20 20 20 20 20 61 75 74 6f  ",          auto
33dc0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
33dd0 23 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46  #else.    UNIXVF
33de0 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20  S("unix",       
33df0 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72     posixIoFinder
33e00 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55   ),.#endif.    U
33e10 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e  NIXVFS("unix-non
33e20 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f  e",     nolockIo
33e30 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
33e40 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66  IXVFS("unix-dotf
33e50 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f  ile",  dotlockIo
33e60 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53  Finder ),.#if OS
33e70 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49  _VXWORKS.    UNI
33e80 58 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64  XVFS("unix-named
33e90 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65  sem", semIoFinde
33ea0 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20  r ),.#endif.#if 
33eb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
33ec0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
33ed0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f  UNIXVFS("unix-po
33ee0 73 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f  six",    posixIo
33ef0 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 21 4f  Finder ),.#if !O
33f00 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e  S_VXWORKS.    UN
33f10 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63  IXVFS("unix-floc
33f20 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69  k",    flockIoFi
33f30 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23  nder ),.#endif.#
33f40 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
33f50 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
33f60 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
33f70 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
33f80 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66  UNIXVFS("unix-af
33f90 70 22 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69  p",      afpIoFi
33fa0 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
33fb0 56 46 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20  VFS("unix-nfs", 
33fc0 20 20 20 20 20 6e 66 73 49 6f 46 69 6e 64 65 72       nfsIoFinder
33fd0 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28   ),.    UNIXVFS(
33fe0 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20 20  "unix-proxy",   
33ff0 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 20 29   proxyIoFinder )
34000 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20  ,.#endif.  };.  
34010 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 20  unsigned int i; 
34020 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
34030 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f   counter */..  /
34040 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56  * Register all V
34050 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20  FSes defined in 
34060 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79  the aVfs[] array
34070 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
34080 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73  <(sizeof(aVfs)/s
34090 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66  izeof(sqlite3_vf
340a0 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  s)); i++){.    s
340b0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
340c0 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d  ter(&aVfs[i], i=
340d0 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  =0);.  }.  retur
340e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
340f0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
34100 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
34110 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
34120 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61  **.** Some opera
34130 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67  ting systems mig
34140 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f  ht need to do so
34150 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68  me cleanup in th
34160 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74  is routine,.** t
34170 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69  o release dynami
34180 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
34190 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f  objects.  But no
341a0 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68  t on unix..** Th
341b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
341c0 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a  no-op for unix..
341d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
341e0 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
341f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34200 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a  ; .}. .#endif /*
34210 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
34220 2a 2f 0a                                         */.