/ Hex Artifact Content
Login

Artifact 417a378a1941b9203d2613c082133fee85199f74:


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 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1600: 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66  ences */.typedef
1610: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
1620: 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20  unixShm;        
1630: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1640: 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  tion shared memo
1650: 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ry */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1670: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20   unixShmNode;   
1680: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
1690: 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f  mory instance */
16a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e  unixInodeInfo un
16c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f  ixInodeInfo;   /
16d0: 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74  * An i-node */.t
16e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
16f0: 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55  ixUnusedFd UnixU
1700: 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20  nusedFd;     /* 
1710: 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  An unused file d
1720: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a  escriptor */../*
1730: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61  .** Sometimes, a
1740: 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64  fter a file hand
1750: 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  le is closed by 
1760: 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65  SQLite, the file
1770: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63   descriptor.** c
1780: 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  annot be closed 
1790: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20  immediately. In 
17a0: 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73  these cases, ins
17b0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f  tances of the fo
17c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
17d0: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
17e0: 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
17f0: 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65  descriptor while
1800: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a   waiting for an.
1810: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
1820: 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f  o either close o
1830: 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73  r reuse it..*/.s
1840: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1850: 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20  Fd {.  int fd;  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1880: 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  tor to close */.
1890: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18b0: 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64  lags this file d
18c0: 65 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70  escriptor was op
18d0: 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55  ened with */.  U
18e0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
18f0: 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  xt;      /* Next
1900: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1910: 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20  criptor on same 
1920: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  file */.};../*.*
1930: 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73  * The unixFile s
1940: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
1950: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
1960: 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f  file specific to
1970: 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53   the unix.** VFS
1980: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1990: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
19a0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69  uct unixFile uni
19b0: 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e  xFile;.struct un
19c0: 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74  ixFile {.  sqlit
19d0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
19e0: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f  nst *pMethod;  /
19f0: 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72  * Always the fir
1a00: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e  st entry */.  un
1a10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1a20: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
1a30: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
1a40: 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e  locks on this in
1a50: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ode */.  int h; 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
1a90: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  tor */.  int dir
1aa0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1ad0: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
1ae0: 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  y */.  unsigned 
1af0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
1b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b10: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
1b20: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1b30: 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e  /.  int lastErrn
1b40: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1b60: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c  nix errno from l
1b70: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1b80: 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67  .  void *locking
1b90: 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20  Context;        
1ba0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e         /* Lockin
1bb0: 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g style specific
1bc0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78   state */.  Unix
1bd0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
1be0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1bf0: 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64  /* Pre-allocated
1c00: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f   UnixUnusedFd */
1c10: 0a 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73  .  int fileFlags
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c30: 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c         /* Miscel
1c40: 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  lanous flags */.
1c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1c60: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1c70: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1c90: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1cc0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1cd0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 53  rmation */.#if S
1ce0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1cf0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
1d00: 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20   openFlags;     
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70   /* The flags sp
1d30: 65 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28  ecified at open(
1d40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1d50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1d60: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64  CKING_STYLE || d
1d70: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1d80: 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46  ).  unsigned fsF
1d90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1da0: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65          /* cache
1db0: 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73  d details from s
1dc0: 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69  tatfs() */.#endi
1dd0: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
1de0: 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b  .  int isDelete;
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
1e10: 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
1e20: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  e */.  struct vx
1e30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
1e40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
1e50: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1e60: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e  #endif.#ifndef N
1e70: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e80: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e90: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1ea0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1eb0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1ec0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ed0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1ee0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1ef0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1f00: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1f10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1f20: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1f30: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1f40: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1f50: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1f60: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f70: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f80: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f90: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1fa0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1fb0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1fc0: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1fd0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1fe0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1ff0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2000: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2010: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
2020: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2030: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2040: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2050: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2060: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2070: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2080: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2090: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
20a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
20b0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
20c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
20d0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
20e0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64  peration */.#end
20f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2100: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2110: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
2120: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2130: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
2140: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2150: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
2160: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
2170: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2180: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
2190: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
21a0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
21b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
21c0: 77 69 6e 67 20 6d 61 63 72 6f 73 20 64 65 66 69  wing macros defi
21d0: 6e 65 20 62 69 74 73 20 69 6e 20 75 6e 69 78 46  ne bits in unixF
21e0: 69 6c 65 2e 66 69 6c 65 46 6c 61 67 73 0a 2a 2f  ile.fileFlags.*/
21f0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
2200: 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49  WHOLE_FILE_LOCKI
2210: 4e 47 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20  NG  0x0001   /* 
2220: 55 73 65 20 77 68 6f 6c 65 2d 66 69 6c 65 20 6c  Use whole-file l
2230: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2240: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2250: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
2260: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
2270: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
2280: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
2290: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
22a0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
22b0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
22c0: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
22d0: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
22e0: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
22f0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2310: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2320: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2330: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2340: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2350: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
2360: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
2370: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
2380: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
2390: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
23c0: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
23d0: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
23e0: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
23f0: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
2400: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
2410: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
2420: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
2430: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
2440: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
2450: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
2460: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
2470: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
2480: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
2490: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
24a0: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
24b0: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
24c0: 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41  # define fcntl(A
24d0: 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ,B,C) 0.#endif..
24e0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
24f0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2500: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
2510: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
2520: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
2530: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2540: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2550: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2560: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2570: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2580: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2590: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  adid 0.#endif...
25a0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
25b0: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
25c0: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
25d0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
25e0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
25f0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
2600: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
2610: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
2620: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
2630: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
2640: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
2650: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
2660: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
2670: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
2680: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
2690: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
26a0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
26b0: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
26c0: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
26d0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
26e0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
26f0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
2700: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
2710: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
2720: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
2730: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
2740: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
2750: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
2760: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
2770: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
2780: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
2790: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
27a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
27b0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
27c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
27d0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
27e0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
27f0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
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 6c 65 61 76 65 28 73 71 6c  _mutex_leave(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 23  IC_MASTER));.}.#
2850: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2860: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
2870: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
2880: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
2890: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
28b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
28c0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
28d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
28e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
28f0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
2900: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
2910: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
2920: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
2930: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
2940: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
2950: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
2960: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
2970: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
2980: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
2990: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
29a0: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
29b0: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
29c0: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
29d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
29e0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
29f0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
2a00: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
2a10: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
2a20: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
2a30: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
2a40: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
2a50: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
2a60: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
2a70: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
2a80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
2a90: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
2aa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
2ab0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
2ac0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
2ad0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
2ae0: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
2af0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
2b00: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
2b10: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
2b20: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2b30: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
2b40: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
2b50: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
2b60: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
2b70: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
2b80: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
2b90: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
2ba0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
2bb0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2bc0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
2bd0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
2be0: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
2bf0: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
2c00: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
2c10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
2c20: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
2c30: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
2c40: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
2c50: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
2c60: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
2c70: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
2c80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c90: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
2ca0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
2cb0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2cc0: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
2cd0: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
2ce0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2cf0: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
2d00: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
2d10: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
2d20: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
2d30: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
2d40: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
2d50: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
2d60: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2d70: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
2d80: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
2d90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2da0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2db0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
2dc0: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
2dd0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2de0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2df0: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
2e00: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63  _SET );.  s = fc
2e10: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
2e20: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
2e30: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
2e40: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2e50: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
2e60: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
2e70: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
2e80: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
2e90: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
2ea0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
2eb0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
2ec0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
2ed0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
2ee0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
2ef0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
2f00: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2f10: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
2f20: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
2f30: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e  l2 = *p;.    fcn
2f40: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
2f50: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
2f60: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
2f70: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2f80: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
2f90: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
2fa0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
2fb0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
2fc0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2fd0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2fe0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
2ff0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
3000: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3010: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
3020: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3030: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
3040: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
3050: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
3060: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
3070: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
3080: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
3090: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
30a0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
30b0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
30c0: 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65  urn s;.}.#define
30d0: 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65   fcntl lockTrace
30e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30f0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a  E_LOCK_TRACE */.
3100: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
3110: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
3120: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
3130: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
3140: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
3150: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
3160: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
3170: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
3180: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
3190: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
31a0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
31b0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
31c0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
31d0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
31e0: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
31f0: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
3200: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
3210: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
3220: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
3230: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
3240: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
3250: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
3260: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
3270: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
3280: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
3290: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
32a0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
32b0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
32c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
32d0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
32e0: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
32f0: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
3300: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
3310: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
3320: 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  {.  case 0: .   
3330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3340: 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  K;.    .  case E
3350: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
3360: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
3370: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
3380: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
3390: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
33a0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
33b0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
33c0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
33d0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
33e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
33f0: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
3400: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
3410: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
3420: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3430: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
3440: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
3450: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
3460: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
3470: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
3480: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
3490: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
34a0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
34b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
34c0: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
34d0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
34e0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
34f0: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
3510: 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74  LOCK) ||..(sqlit
3520: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
3530: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
3540: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
3550: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3560: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
3570: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
3580: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
3590: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
35a0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
35b0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 44 45 41      .  case EDEA
35c0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
35d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
35e0: 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45  CKED;.    .#if E
35f0: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
3600: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
3610: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
3620: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
3630: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
3640: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
3650: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
3660: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
3670: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
3680: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
3690: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
36a0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
36b0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
36c0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
36d0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
36e0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
36f0: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
3700: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
3710: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
3720: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
3730: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
3740: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
3750: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
3760: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
3770: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
3780: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
3790: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
37a0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73  se ENOENT:.  cas
37b0: 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65  e ESTALE:.  case
37c0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
37d0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
37e0: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
37f0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
3800: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
3810: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
3820: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
3830: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
3840: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3890: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
38a0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
38b0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
38c0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
38d0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
38e0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
38f0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
3900: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
3910: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
3920: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
3930: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
3940: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
3950: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
3960: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
3970: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
3980: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
3990: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
39a0: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
39b0: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
39c0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
39d0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
39e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
39f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3a00: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
3a10: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
3a20: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
3a30: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
3a40: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
3a50: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
3a60: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
3a70: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
3a80: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
3a90: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
3aa0: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
3ab0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
3ac0: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
3ad0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
3ae0: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
3af0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
3b00: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
3b10: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
3b20: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
3b30: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
3b40: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
3b50: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
3b60: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
3b70: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
3b80: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
3b90: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
3ba0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
3bb0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3bc0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
3bd0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
3be0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
3bf0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
3c00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3c30: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3c40: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
3c50: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
3c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3c70: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
3c80: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
3c90: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
3ca0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
3cb0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
3cc0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
3cd0: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
3ce0: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
3cf0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
3d00: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
3d10: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
3d20: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
3d30: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
3d40: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3d50: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
3d60: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
3d70: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
3d80: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
3d90: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
3da0: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
3db0: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
3dc0: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
3dd0: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
3de0: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
3df0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
3e00: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
3e10: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
3e20: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
3e30: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
3e40: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
3e50: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3e60: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
3e70: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
3e80: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
3e90: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
3ea0: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
3eb0: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
3ec0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
3ed0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
3ee0: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
3ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
3f00: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
3f10: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
3f20: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3f30: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
3f40: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
3f50: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
3f60: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3f70: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
3f80: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
3f90: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
3fa0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
3fb0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
3fc0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
3fd0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
3fe0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
3ff0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
4000: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
4010: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
4020: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
4030: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
4040: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
4050: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
4060: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
4070: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
4080: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
4090: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
40a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
40b0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
40c0: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
40d0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
40e0: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
40f0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
4100: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
4110: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
4120: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
4130: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4140: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
4150: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
4160: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
4170: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
4180: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
4190: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
41a0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
41b0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
41c0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
41d0: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
41e0: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
41f0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
4200: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
4210: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
4220: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
4230: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
4240: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4250: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4260: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
4270: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
4280: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
4290: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
42a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
42b0: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
42c0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
42d0: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
42e0: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
42f0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
4300: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
4310: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
4320: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
4330: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
4340: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
4350: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
4380: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
4390: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
43a0: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
43b0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
43c0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
43d0: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
43e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
43f0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
4400: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
4410: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4420: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4430: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4440: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
4450: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
4460: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
4470: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
4480: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
4490: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
44a0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
44b0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
44c0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
44d0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
44e0: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
44f0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
4500: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
4510: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
4520: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4530: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
4540: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
4550: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
4560: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
4570: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
4580: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
4590: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
45a0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
45b0: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
45c0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
45d0: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
45e0: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
45f0: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
4600: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
4610: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
4620: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
4630: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
4640: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
4650: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
4660: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
4670: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
4680: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
4690: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
46a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
46b0: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
46c0: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
46d0: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
46e0: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
46f0: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
4700: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
4710: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
4720: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
4730: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
4740: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
4750: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
4760: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
4770: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
4780: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
4790: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
47a0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
47b0: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
47c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
47d0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
47e0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
47f0: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
4800: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
4810: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
4820: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
4830: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
4840: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
4850: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
4860: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
4870: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
4880: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
4890: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
48a0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
48b0: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
48c0: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
48d0: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
48e0: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
48f0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
4900: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
4910: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
4920: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
4930: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
4940: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
4950: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4960: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
4970: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
4980: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
49f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
4a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
4a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
4a60: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
4a70: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a90: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
4aa0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
4ab0: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
4ac0: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
4ad0: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
4ae0: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
4af0: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
4b00: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
4b10: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
4b20: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
4b30: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
4b40: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
4b50: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
4b60: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
4b70: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
4b80: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
4b90: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
4ba0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
4bb0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
4bc0: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
4bd0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4be0: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
4bf0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
4c00: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
4c10: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
4c20: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
4c30: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
4c40: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
4c50: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
4c60: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4c70: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
4c80: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
4c90: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
4ca0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
4cb0: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
4cc0: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
4cd0: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
4ce0: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
4cf0: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
4d00: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
4d10: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
4d20: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
4d30: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
4d40: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
4d50: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
4d60: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
4d70: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
4d80: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
4d90: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
4da0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
4db0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
4dc0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
4dd0: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
4de0: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
4df0: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
4e00: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
4e10: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
4e20: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
4e30: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
4e40: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
4e50: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
4e60: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
4e70: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
4e80: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
4e90: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
4ea0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
4eb0: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
4ec0: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
4ed0: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
4ee0: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
4ef0: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
4f00: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
4f10: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
4f20: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
4f30: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
4f40: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
4f50: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
4f60: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
4f70: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
4f80: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4f90: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4fa0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
4fb0: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
4fc0: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
4fd0: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
4fe0: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
4ff0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
5000: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
5010: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
5020: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
5030: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
5040: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
5050: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
5060: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
5070: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
5080: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
5090: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
50a0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
50b0: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
50c0: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
50d0: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
50e0: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
50f0: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
5100: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
5110: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
5120: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
5130: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
5140: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
5150: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
5160: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
5170: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
5180: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
5190: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
51a0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
51b0: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
51c0: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
51d0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
51e0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
51f0: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
5200: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
5210: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
5220: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
5230: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
5240: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
5250: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
5260: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
5270: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
5280: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
5290: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
52a0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
52b0: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
52c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
52d0: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
52e0: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
52f0: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
5300: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
5310: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
5320: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
5330: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
5340: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
5350: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
5360: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
5370: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
5380: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
5390: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
53a0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
53b0: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
53c0: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
53d0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
53e0: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
53f0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5400: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
5410: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
5420: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
5430: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
5440: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
5450: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
5460: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
5470: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
5480: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
5490: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
54a0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
54b0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
54c0: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
54d0: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
54e0: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
54f0: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
5500: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
5510: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
5520: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
5530: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
5540: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
5550: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
5560: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
5570: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
5580: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
5590: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
55a0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
55b0: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
55c0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
55d0: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
55e0: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
55f0: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
5600: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
5610: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
5620: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
5630: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
5640: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
5650: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
5660: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
5670: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
5680: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
5690: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
56a0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
56b0: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
56c0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
56d0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
56e0: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
56f0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
5700: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
5710: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
5720: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
5730: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
5740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
5750: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
5760: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
5770: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
5780: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
5790: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
57a0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
57b0: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
57c0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
57d0: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
57e0: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
57f0: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
5800: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5810: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
5820: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
5830: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
5840: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
5850: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
5860: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
5870: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
5880: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
5890: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
58a0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
58b0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
58c0: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
58d0: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
58e0: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
58f0: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
5900: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
5910: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
5920: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
5930: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
5940: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
5950: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
5960: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
5970: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
5980: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
5990: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
59a0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
59b0: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
59c0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
59d0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
59e0: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
59f0: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
5a00: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
5a10: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
5a20: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
5a30: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
5a40: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
5a50: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
5a60: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
5a70: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
5a80: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
5a90: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
5aa0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
5ab0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
5ac0: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
5ad0: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
5ae0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5af0: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
5b00: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
5b10: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
5b20: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
5b30: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
5b40: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
5b50: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
5b60: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
5b70: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
5b80: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
5b90: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
5ba0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
5bb0: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
5bc0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
5bd0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5be0: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
5bf0: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
5c00: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
5c10: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
5c20: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
5c30: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
5c40: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
5c50: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
5c60: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
5c70: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
5c80: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
5c90: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
5ca0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
5cb0: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
5cc0: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
5cd0: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
5ce0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
5cf0: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
5d00: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
5d10: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
5d20: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
5d30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
5d40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
5d50: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
5d60: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
5d70: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
5d80: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
5d90: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
5da0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
5db0: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
5dc0: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
5dd0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
5de0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
5df0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
5e00: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
5e10: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
5e20: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
5e30: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
5e40: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e60: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
5e70: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5e80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
5e90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
5ea0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
5eb0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
5ec0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
5ed0: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
5ee0: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
5ef0: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
5f00: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
5f10: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
5f20: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
5f30: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
5f40: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
5f50: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
5f60: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
5f70: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
5f80: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
5fa0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
5fb0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
5fc0: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
5fd0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
5fe0: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
5ff0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
6000: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
6010: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
6020: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
6030: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
6040: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
6050: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6080: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
6090: 64 20 2a 2f 0a 20 20 69 6e 74 20 65 46 69 6c 65  d */.  int eFile
60a0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
60b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
60c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
60d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
60e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6110: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
6120: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
6130: 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
6140: 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
6150: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
6160: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
6170: 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a  ith this inode *
6180: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
61b0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c   outstanding fil
61c0: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69  e locks */.  Uni
61d0: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
61e0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
61f0: 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  Unused file desc
6200: 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65  riptors to close
6210: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
6220: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
6230: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
6240: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
6250: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
6260: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
6270: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
6280: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
6290: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20  y linked */.#if 
62a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
62b0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
62c0: 59 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65 64 20  YLE).  unsigned 
62d0: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
62e0: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
62f0: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
6300: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
6310: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
6320: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
6350: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
6360: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
6370: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
6380: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
6390: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
63a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
63b0: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
63c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
63d0: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
63e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
63f0: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
6400: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69  .** Close all fi
6410: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61  le descriptors a
6420: 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65  ccumuated in the
6430: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e   unixInodeInfo->
6440: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  pUnused list..**
6450: 20 49 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c   If all such fil
6460: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 72  e descriptors ar
6470: 65 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74  e closed without
6480: 20 65 72 72 6f 72 2c 20 74 68 65 20 6c 69 73 74   error, the list
6490: 20 69 73 0a 2a 2a 20 63 6c 65 61 72 65 64 20 61   is.** cleared a
64a0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
64b0: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  urned..**.** Oth
64c0: 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
64d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
64e0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c   successfully cl
64f0: 6f 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  osed file descri
6500: 70 74 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ptor.** entries 
6510: 61 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  are removed from
6520: 20 74 68 65 20 6c 69 73 74 2c 20 61 6e 64 20 53   the list, and S
6530: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
6540: 45 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  E returned. .** 
6550: 6e 6f 74 20 64 65 6c 65 74 65 64 20 61 6e 64 20  not deleted and 
6560: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
6570: 53 45 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20  SE returned..*/ 
6580: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
6590: 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78  ePendingFds(unix
65a0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
65b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
65c0: 4f 4b 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  OK;.  unixInodeI
65d0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
65e0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
65f0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 45 72  nixUnusedFd *pEr
6600: 72 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  ror = 0;.  UnixU
6610: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
6620: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
6630: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64  t;.  for(p=pInod
6640: 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70  e->pUnused; p; p
6650: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
6660: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
6670: 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e     if( close(p->
6680: 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  fd) ){.      pFi
6690: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
66a0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
66b0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
66c0: 4c 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70  LOSE;.      p->p
66d0: 4e 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20  Next = pError;. 
66e0: 20 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b       pError = p;
66f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6700: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6710: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
6720: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
6730: 20 70 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72   pError;.  retur
6740: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6750: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f  elease a unixIno
6760: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
6770: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
6780: 63 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f  cated by findIno
6790: 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20  deInfo()..**.** 
67a0: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
67b0: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
67c0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
67d0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
67e0: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
67f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6800: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
6810: 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  id releaseInodeI
6820: 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nfo(unixFile *pF
6830: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
6840: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
6850: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
6860: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
6870: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
6880: 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ( pInode ){.    
6890: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pInode->nRef--;.
68a0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
68b0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
68c0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
68d0: 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a  >pShmNode==0 );.
68e0: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
68f0: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
6900: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
6910: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
6920: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
6930: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
6940: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
6950: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
6960: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
6970: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
6980: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
6990: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70  rt( inodeList==p
69a0: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
69b0: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
69c0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
69d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
69e0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  node->pNext ){. 
69f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6a00: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
6a10: 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  rev==pInode );. 
6a20: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
6a30: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  Next->pPrev = pI
6a40: 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20  node->pPrev;.   
6a50: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
6a60: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
6a70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
6a80: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
6a90: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
6aa0: 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ate the unixInod
6ab0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  eInfo object tha
6ac0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
6ad0: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
6ae0: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e  tor.  Create a n
6af0: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
6b00: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
6b10: 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20  urn value might 
6b20: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
6b30: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
6b40: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  urs..**.** The m
6b50: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
6b60: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
6b70: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
6b80: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
6b90: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
6ba0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
6bb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
6bc0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
6bd0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
6be0: 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e   int findInodeIn
6bf0: 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  fo(.  unixFile *
6c00: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
6c10: 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c       /* Unix fil
6c20: 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63  e with file desc
6c30: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
6c40: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
6c50: 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20  nfo **ppInode   
6c60: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
6c70: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
6c80: 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a   object here */.
6c90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61      /* System ca
6cc0: 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ll return code *
6cd0: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
6d00: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46  escriptor for pF
6d10: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
6d20: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
6d30: 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75  d;      /* Looku
6d40: 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e  p key for the un
6d50: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20  ixInodeInfo */. 
6d60: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
6d70: 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  tbuf;           
6d80: 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
6d90: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
6da0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
6db0: 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20   *pInode = 0;   
6dc0: 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75    /* Candidate u
6dd0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
6de0: 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ect */..  assert
6df0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
6e00: 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c  ) );..  /* Get l
6e10: 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61  ow-level informa
6e20: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
6e30: 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20  ile that we can 
6e40: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  used to.  ** cre
6e50: 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d  ate a unique nam
6e60: 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  e for the file..
6e70: 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c    */.  fd = pFil
6e80: 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 66 73 74  e->h;.  rc = fst
6e90: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
6ea0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
6eb0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
6ec0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
6ed0: 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a  ifdef EOVERFLOW.
6ee0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
6ef0: 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  astErrno==EOVERF
6f00: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
6f10: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
6f20: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
6f30: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
6f40: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
6f50: 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e  .  /* On OS X on
6f60: 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79   an msdos filesy
6f70: 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20  stem, the inode 
6f80: 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74  number is report
6f90: 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63  ed.  ** incorrec
6fa0: 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a  tly for zero-siz
6fb0: 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69  e files.  See ti
6fc0: 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20  cket #3260.  To 
6fd0: 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64  work.  ** around
6fe0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77   this problem (w
6ff0: 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20  e consider it a 
7000: 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74  bug in OS X, not
7010: 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65   SQLite).  ** we
7020: 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65   always increase
7030: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74   the file size t
7040: 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61  o 1 by writing a
7050: 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a   single byte.  *
7060: 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73  * prior to acces
7070: 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e  sing the inode n
7080: 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20  umber.  The one 
7090: 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a  byte written is.
70a0: 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53    ** an ASCII 'S
70b0: 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  ' character whic
70c0: 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74  h also happens t
70d0: 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62  o be the first b
70e0: 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  yte.  ** in the 
70f0: 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20  header of every 
7100: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
7110: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69    In this way, i
7120: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  f there.  ** is 
7130: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
7140: 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68   such that anoth
7150: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c  er thread has al
7160: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a  ready populated.
7170: 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70    ** the first p
7180: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
7190: 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69  ase, no damage i
71a0: 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  s done..  */.  i
71b0: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  f( statbuf.st_si
71c0: 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  ze==0 && (pFile-
71d0: 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  >fsFlags & SQLIT
71e0: 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
71f0: 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  OS)!=0 ){.    rc
7200: 20 3d 20 77 72 69 74 65 28 66 64 2c 20 22 53 22   = write(fd, "S"
7210: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
7220: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=1 ){.      pFi
7230: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
7240: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
7250: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
7260: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
7270: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
7280: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
7290: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=0 ){.      pFi
72a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
72b0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
72c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
72d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
72e0: 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  if..  memset(&fi
72f0: 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  leId, 0, sizeof(
7300: 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65  fileId));.  file
7310: 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  Id.dev = statbuf
7320: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
7330: 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64  VXWORKS.  fileId
7340: 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49  .pId = pFile->pI
7350: 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49  d;.#else.  fileI
7360: 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  d.ino = statbuf.
7370: 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20  st_ino;.#endif. 
7380: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
7390: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
73a0: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
73b0: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
73c0: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
73d0: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
73e0: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
73f0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
7400: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
7410: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
7420: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
7430: 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20  of(*pInode) );. 
7440: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30     if( pInode==0
7450: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7460: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7470: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
7480: 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  pInode, 0, sizeo
7490: 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20  f(*pInode));.   
74a0: 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d   memcpy(&pInode-
74b0: 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64  >fileId, &fileId
74c0: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
74d0: 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  );.    pInode->n
74e0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e  Ref = 1;.    pIn
74f0: 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f  ode->pNext = ino
7500: 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f  deList;.    pIno
7510: 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  de->pPrev = 0;. 
7520: 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74     if( inodeList
7530: 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50   ) inodeList->pP
7540: 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  rev = pInode;.  
7550: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
7560: 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  node;.  }else{. 
7570: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b     pInode->nRef+
7580: 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64  +;.  }.  *ppInod
7590: 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65  e = pInode;.  re
75a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
75b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
75c0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
75d0: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
75e0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
75f0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
7600: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
7610: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
7620: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
7630: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
7640: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
7650: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
7660: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
7670: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
7680: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
7690: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
76a0: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
76b0: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
76c0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
76d0: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
76e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
76f0: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
7700: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
7710: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
7720: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
7730: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
7740: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
7750: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
7760: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
7770: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
7780: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
7790: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
77a0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
77b0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
77c0: 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
77d0: 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
77e0: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
77f0: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
7800: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
7810: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
7820: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
7830: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
7840: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
7850: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
7860: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
7870: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
7880: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
7890: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
78a0: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
78b0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
78c0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  .  */.#ifndef __
78d0: 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72  DJGPP__.  if( !r
78e0: 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73  eserved ){.    s
78f0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
7900: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
7910: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
7920: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
7930: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
7940: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
7950: 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c   = 1;.    lock.l
7960: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
7970: 0a 20 20 20 20 69 66 20 28 2d 31 20 3d 3d 20 66  .    if (-1 == f
7980: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
7990: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20  _GETLK, &lock)) 
79a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
79b0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
79c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
79d0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
79e0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
79f0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
7a00: 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
7a10: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
7a20: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
7a30: 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c   else if( lock.l
7a40: 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29  _type!=F_UNLCK )
7a50: 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  {.      reserved
7a60: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
7a70: 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78  #endif.  .  unix
7a80: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
7a90: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
7aa0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
7ab0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
7ac0: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
7ad0: 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
7ae0: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
7af0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7b00: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
7b10: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
7b20: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
7b30: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
7b40: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
7b50: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
7b60: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
7b70: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
7b80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
7b90: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
7ba0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
7bb0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
7bc0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
7bd0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
7be0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
7bf0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
7c00: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
7c10: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
7c20: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
7c30: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
7c40: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
7c50: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
7c60: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
7c70: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
7c80: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
7c90: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
7ca0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
7cb0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
7cc0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
7cd0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
7ce0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
7cf0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
7d00: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
7d10: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
7d20: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
7d30: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
7d40: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
7d50: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
7d60: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
7d70: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
7d80: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
7d90: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
7da0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
7db0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7dc0: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
7dd0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
7de0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
7df0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
7e00: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
7e10: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
7e20: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
7e30: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
7e40: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
7e50: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
7e60: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
7e70: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
7e80: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
7e90: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
7ea0: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
7eb0: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
7ec0: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
7ed0: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
7ee0: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
7ef0: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
7f00: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
7f10: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
7f20: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
7f30: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
7f40: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
7f50: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
7f60: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
7f70: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
7f80: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
7f90: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
7fa0: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
7fb0: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
7fc0: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
7fd0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
7fe0: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
7ff0: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
8000: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
8010: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
8020: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
8030: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
8040: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
8050: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
8060: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
8070: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
8080: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
8090: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
80a0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
80b0: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
80c0: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
80d0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
80e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
80f0: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
8100: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
8110: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
8120: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
8130: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
8140: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
8150: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
8160: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
8170: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
8180: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
8190: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
81a0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
81b0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
81c0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
81d0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
81e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
81f0: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
8200: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
8210: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
8220: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
8230: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
8240: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
8250: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
8260: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
8270: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
8280: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
8290: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
82a0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
82b0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
82c0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
82d0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
82e0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
82f0: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
8300: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
8310: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
8320: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
8330: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
8340: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
8350: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
8360: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
8370: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
8380: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
8390: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
83a0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
83b0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
83c0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
83d0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
83e0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
83f0: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
8400: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
8410: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
8420: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
8430: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
8440: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
8450: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
8460: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
8470: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
8480: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
8490: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
84a0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
84b0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
84c0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
84d0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
84e0: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
84f0: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
8500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
8510: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
8520: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
8530: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
8540: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
8550: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
8560: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
8570: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
8580: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
8590: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
85a0: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
85b0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
85c0: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
85d0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
85e0: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
85f0: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
8600: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
8610: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
8620: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
8630: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
8640: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
8650: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
8660: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
8670: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
8680: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
8690: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
86a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
86b0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
86c0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
86d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
86e0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
86f0: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
8700: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
8710: 20 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 74 45   s = 0;.  int tE
8720: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
8730: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
8740: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
8750: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
8760: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
8770: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
8780: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
8790: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
87a0: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
87b0: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
87c0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
87d0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
87e0: 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
87f0: 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
8800: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
8810: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
8820: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
8830: 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
8840: 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
8850: 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
8860: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
8870: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
8880: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
8890: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
88a0: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
88b0: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
88c0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
88d0: 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
88e0: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
88f0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
8900: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
8910: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
8920: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
8930: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
8940: 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
8950: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8960: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
8970: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
8980: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
8990: 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57  ect..  **  (1) W
89a0: 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
89b0: 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
89c0: 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
89d0: 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
89e0: 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
89f0: 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
8a00: 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
8a10: 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
8a20: 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
8a30: 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
8a40: 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
8a50: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
8a60: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
8a70: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
8a80: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
8a90: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
8aa0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
8ab0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
8ac0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
8ad0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
8ae0: 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
8af0: 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
8b00: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
8b10: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
8b20: 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
8b30: 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
8b40: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
8b50: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
8b60: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
8b70: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
8b80: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
8b90: 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
8ba0: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
8bb0: 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
8bc0: 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
8bd0: 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
8be0: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
8bf0: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
8c00: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
8c10: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
8c20: 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
8c30: 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
8c40: 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
8c50: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
8c60: 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
8c70: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
8c80: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
8c90: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  .  ){.    rc = S
8ca0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
8cb0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
8cc0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48   }..  /* If a SH
8cd0: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
8ce0: 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
8cf0: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
8d00: 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
8d10: 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
8d20: 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
8d30: 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
8d40: 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
8d50: 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
8d60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
8d70: 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
8d80: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
8d90: 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64  && .      (pInod
8da0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
8db0: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
8dc0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
8dd0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
8de0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
8df0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
8e00: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
8e10: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
8e20: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
8e30: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
8e40: 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
8e50: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
8e60: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
8e70: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
8e80: 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
8e90: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
8ea0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
8eb0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44   }...  /* A PEND
8ec0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
8ed0: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
8ee0: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
8ef0: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
8f00: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
8f10: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
8f20: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
8f30: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
8f40: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
8f50: 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c  leased..  */.  l
8f60: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
8f70: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
8f80: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66  = SEEK_SET;.  if
8f90: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
8fa0: 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
8fb0: 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
8fc0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
8fd0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
8fe0: 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
8ff0: 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f    ){.    lock.l_
9000: 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63  type = (eFileLoc
9010: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  k==SHARED_LOCK?F
9020: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
9030: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
9040: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
9050: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
9060: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
9070: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
9080: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
9090: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
90a0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
90b0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
90c0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
90d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
90e0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
90f0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
9100: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
9110: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
9120: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
9130: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
9140: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
9150: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
9160: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
9170: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
9180: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
9190: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
91a0: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
91b0: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
91c0: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
91d0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
91e0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
91f0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
9200: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
9210: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
9220: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
9230: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
9240: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
9250: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
9260: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
9270: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
9280: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
9290: 45 3b 0a 20 20 20 20 69 66 28 20 28 73 20 3d 20  E;.    if( (s = 
92a0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
92b0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29  F_SETLK, &lock))
92c0: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
92d0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
92e0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
92f0: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
9300: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
9310: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9320: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
9330: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
9340: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
9350: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
9360: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70  .    if( fcntl(p
9370: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
9380: 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20  , &lock)!=0 ){. 
9390: 20 20 20 20 20 69 66 28 20 73 20 21 3d 20 2d 31       if( s != -1
93a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
93b0: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
93c0: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
93d0: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mount */.       
93e0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
93f0: 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73   .        rc = s
9400: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9410: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9420: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
9430: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20  LOCK); .        
9440: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
9450: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
9460: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9470: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
9480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9490: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
94a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
94b0: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
94c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
94d0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
94e0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
94f0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
9500: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
9510: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
9520: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
9530: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
9540: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
9550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
9560: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
9570: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
9580: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
9590: 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
95a0: 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
95b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
95c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
95d0: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
95e0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
95f0: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
9600: 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
9610: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
9620: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
9630: 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73  in this.    ** s
9640: 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
9650: 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
9660: 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
9670: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
9680: 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
9690: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
96a0: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
96b0: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
96c0: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
96d0: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
96e0: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
96f0: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
9700: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
9710: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
9720: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
9730: 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
9740: 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f  leLock );.    lo
9750: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
9760: 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28  LCK;.    switch(
9770: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
9780: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
9790: 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  D_LOCK:.        
97a0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
97b0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
97c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
97d0: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
97e0: 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  E_LOCK:.        
97f0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
9800: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
9810: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
9820: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
9830: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9840: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
9850: 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
9860: 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63      }.    s = fc
9870: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
9880: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
9890: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
98a0: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
98b0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
98c0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
98d0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
98e0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
98f0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
9900: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
9910: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
9920: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
9930: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
9940: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
9950: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
9960: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
9970: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
9980: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
9990: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
99a0: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
99b0: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
99c0: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
99d0: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
99e0: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
99f0: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
9a00: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
9a10: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
9a20: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
9a30: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
9a40: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
9a50: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
9a60: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
9a70: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
9a80: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
9a90: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
9aa0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
9ab0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
9ac0: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
9ad0: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
9ae0: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
9af0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
9b00: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
9b10: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
9b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
9b30: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
9b40: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
9b50: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
9b60: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
9b70: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
9b80: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
9b90: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
9ba0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
9bb0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
9bc0: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
9bd0: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
9be0: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
9bf0: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
9c00: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
9c10: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
9c20: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
9c30: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
9c40: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
9c50: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
9c60: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
9c70: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
9c80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
9c90: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
9ca0: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
9cb0: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
9cc0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
9cd0: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
9ce0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
9cf0: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
9d00: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
9d10: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
9d20: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
9d30: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
9d40: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
9d50: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
9d60: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
9d70: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
9d80: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
9d90: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
9da0: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
9db0: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
9dc0: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
9dd0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
9de0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
9df0: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
9e00: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
9e10: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
9e20: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
9e30: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
9e40: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
9e50: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
9e60: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
9e70: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
9e80: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
9e90: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
9ea0: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
9eb0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
9ec0: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
9ed0: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
9ee0: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
9ef0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
9f00: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
9f10: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
9f20: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
9f30: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
9f40: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
9f50: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
9f60: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
9f70: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
9f80: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
9f90: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
9fa0: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
9fb0: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
9fc0: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
9fd0: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
9fe0: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
9ff0: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
a000: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
a010: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
a020: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
a030: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
a040: 74 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73  t _posixUnlock(s
a050: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
a060: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20   int eFileLock, 
a070: 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  int handleNFSUnl
a080: 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ock){.  unixFile
a090: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
a0a0: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
a0b0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
a0c0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
a0d0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
a0e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
a0f0: 6e 74 20 68 3b 0a 20 20 69 6e 74 20 74 45 72 72  nt h;.  int tErr
a100: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
a110: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
a120: 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
a130: 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
a140: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  /..  assert( pFi
a150: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
a160: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
a170: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
a180: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
a190: 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
a1a0: 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65  ock,.      pFile
a1b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
a1c0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
a1d0: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
a1e0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
a1f0: 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
a200: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
a210: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
a220: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
a230: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
a240: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
a250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a260: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
a270: 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70  Mutex();.  h = p
a280: 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64  File->h;.  pInod
a290: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
a2a0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
a2b0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
a2c0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
a2d0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
a2e0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
a2f0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
a300: 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
a310: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
a320: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
a330: 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69  enign(1);.    Si
a340: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
a350: 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75  =(-1) ).    Simu
a360: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
a370: 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  n(0);..#ifndef N
a380: 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
a390: 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
a3a0: 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
a3b0: 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
a3c0: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
a3d0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
a3e0: 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
a3f0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
a400: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
a410: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
a420: 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
a430: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
a440: 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
a450: 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
a460: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
a470: 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
a480: 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
a490: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
a4a0: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
a4b0: 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
a4c0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
a4d0: 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
a4e0: 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
a4f0: 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
a500: 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
a510: 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
a520: 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
a530: 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
a540: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
a550: 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a  n..    */.#if 0.
a560: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
a570: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
a580: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
a590: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
a5a0: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
a5b0: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
a5c0: 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66  hng==1 );.#endif
a5d0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
a5e0: 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23  rmalWrite = 0;.#
a5f0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f  endif..    /* do
a600: 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73  wngrading to a s
a610: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46  hared lock on NF
a620: 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72  S involves clear
a630: 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ing the write lo
a640: 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ck.    ** before
a650: 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68   establishing th
a660: 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20  e readlock - to 
a670: 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e  avoid a race con
a680: 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72  dition we downgr
a690: 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  ade.    ** the l
a6a0: 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c  ock in 2 blocks,
a6b0: 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66   so that part of
a6c0: 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20   the range will 
a6d0: 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  be covered by a 
a6e0: 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f  .    ** write lo
a6f0: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73  ck until the res
a700: 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20  t is covered by 
a710: 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20  a read lock:.   
a720: 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57   **  1:   [WWWWW
a730: 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b  ].    **  2:   [
a740: 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33  ....W].    **  3
a750: 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20  :   [RRRRW].    
a760: 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d  **  4:   [RRRR.]
a770: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
a780: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
a790: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
a7a0: 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
a7b0: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  ock ){.        o
a7c0: 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53  ff_t divSize = S
a7d0: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a  HARED_SIZE - 1;.
a7e0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
a7f0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
a800: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
a810: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
a820: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
a830: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a840: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
a850: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
a860: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
a870: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
a880: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
a890: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
a8a0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
a8b0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
a8c0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
a8d0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
a8e0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
a8f0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
a900: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
a910: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
a920: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
a930: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
a940: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
a950: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
a960: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
a970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
a980: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
a990: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
a9a0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
a9b0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
a9c0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
a9d0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
a9e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
a9f0: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
aa00: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
aa10: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
aa20: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
aa30: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
aa40: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
aa50: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
aa60: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
aa70: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
aa80: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
aa90: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
aaa0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
aab0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
aac0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
aad0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
aae0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
aaf0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
ab00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
ab10: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
ab20: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
ab30: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
ab40: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
ab50: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
ab60: 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
ab70: 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
ab80: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
ab90: 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
aba0: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
abb0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
abc0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
abd0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
abe0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
abf0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
ac00: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ac10: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ac20: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
ac30: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
ac40: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
ac50: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
ac60: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
ac70: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
ac80: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
ac90: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
aca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
acb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  se{.        lock
acc0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
acd0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
ace0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
acf0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
ad00: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ad10: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
ad20: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
ad30: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
ad40: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
ad50: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ad60: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ad70: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
ad80: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
ad90: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
ada0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
adb0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
adc0: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
add0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ade0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
adf0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ae00: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ae10: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ae20: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ae30: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ae40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ae50: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
ae60: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
ae70: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
ae80: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
ae90: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
aea0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
aeb0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
aec0: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
aed0: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
aee0: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
aef0: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
af00: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28  SETLK, &lock)!=(
af10: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  -1) ){.      pIn
af20: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
af30: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
af40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
af50: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
af60: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
af70: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
af80: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
af90: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
afa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
afb0: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
afc0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
afd0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
afe0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
aff0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
b000: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
b010: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
b020: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
b030: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
b040: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
b050: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
b060: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
b070: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
b080: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
b090: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
b0a0: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
b0b0: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
b0c0: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
b0d0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
b0e0: 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
b0f0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
b100: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
b110: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
b120: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
b130: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
b140: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
b150: 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
b160: 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75  = 0L;.      Simu
b170: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
b180: 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
b190: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
b1a0: 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
b1b0: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
b1c0: 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
b1d0: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
b1e0: 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29  , &lock)!=(-1) )
b1f0: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
b200: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
b210: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
b220: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 45 72 72  se{.        tErr
b230: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
b240: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
b250: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
b260: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
b270: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
b280: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
b290: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
b2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
b2b0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
b2c0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  Errno;.        }
b2d0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
b2e0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
b2f0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
b300: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
b310: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
b320: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
b330: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
b340: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
b350: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
b360: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
b370: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
b380: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
b390: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
b3a0: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
b3b0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
b3c0: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
b3d0: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
b3e0: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
b3f0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
b400: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
b410: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
b420: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
b430: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
b440: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
b450: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
b460: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (pFile);.      i
b470: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b480: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
b490: 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
b4a0: 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e    }.  }...end_un
b4b0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
b4c0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
b4d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
b4e0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
b4f0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
b500: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b510: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
b520: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
b530: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
b540: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
b550: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
b560: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b570: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
b580: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
b590: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
b5a0: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
b5b0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
b5c0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
b5d0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
b5e0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
b5f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
b600: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
b610: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
b620: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
b630: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
b640: 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70  ck){.  return _p
b650: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
b660: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
b670: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b680: 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
b690: 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
b6a0: 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
b6b0: 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
b6c0: 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
b6d0: 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
b6e0: 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
b6f0: 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
b700: 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
b710: 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
b720: 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
b730: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
b740: 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
b750: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
b760: 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
b770: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
b780: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
b790: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
b7a0: 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
b7b0: 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
b7c0: 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
b7d0: 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
b7e0: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
b7f0: 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
b800: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
b810: 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
b820: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
b830: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
b840: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
b850: 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20    if( pFile ){. 
b860: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69     if( pFile->di
b870: 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rfd>=0 ){.      
b880: 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28  int err = close(
b890: 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20  pFile->dirfd);. 
b8a0: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
b8b0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
b8c0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
b8d0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
b8e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
b8f0: 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d  R_CLOSE;.      }
b900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
b910: 69 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20  ile->dirfd=-1;. 
b920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b930: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
b940: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
b950: 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  r = close(pFile-
b960: 3e 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  >h);.      if( e
b970: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  rr ){.        pF
b980: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
b990: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
b9a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
b9b0: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  ERR_CLOSE;.     
b9c0: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f   }.    }.#if OS_
b9d0: 56 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20  VXWORKS.    if( 
b9e0: 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
b9f0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
ba00: 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  sDelete ){.     
ba10: 20 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d     unlink(pFile-
ba20: 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  >pId->zCanonical
ba30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
ba40: 20 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65       vxworksRele
ba50: 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
ba60: 3e 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69  >pId);.      pFi
ba70: 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20  le->pId = 0;.   
ba80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53   }.#endif.    OS
ba90: 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20  TRACE(("CLOSE   
baa0: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
bab0: 68 29 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  h));.    OpenCou
bac0: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 73 71  nter(-1);.    sq
bad0: 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
bae0: 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20  ->pUnused);.    
baf0: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
bb00: 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
bb10: 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
bb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
bb30: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
bb40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
bb50: 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74   unixClose(sqlit
bb60: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
bb70: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bb80: 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
bb90: 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
bba0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
bbb0: 2a 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e  *)id;.    unixUn
bbc0: 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
bbd0: 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
bbe0: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
bbf0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26   pFile->pInode &
bc00: 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
bc10: 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  >nLock ){.      
bc20: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
bc30: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
bc40: 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
bc50: 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
bc60: 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e just.      ** 
bc70: 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
bc80: 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
bc90: 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
bca0: 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
bcb0: 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
bcc0: 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
bcd0: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
bce0: 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
bcf0: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
bd00: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
bd10: 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
bd20: 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
bd30: 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
bd40: 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
bd50: 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  }.    releaseIno
bd60: 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
bd70: 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
bd80: 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
bd90: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
bda0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bdb0: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
bdc0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
bdd0: 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
bde0: 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
bdf0: 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
be00: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
be10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be50: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
beb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bec0: 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
bed0: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
bee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bef0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
bf00: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
bf10: 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
bf20: 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
bf30: 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
bf40: 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
bf50: 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
bf60: 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
bf70: 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
bf80: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
bf90: 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
bfa0: 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
bfb0: 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
bfc0: 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
bfd0: 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
bfe0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
bff0: 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
c000: 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
c010: 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
c020: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
c030: 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
c040: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
c050: 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
c060: 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
c070: 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
c080: 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
c090: 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
c0a0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
c0b0: 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
c0c0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
c0d0: 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
c0e0: 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
c0f0: 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
c100: 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
c110: 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
c120: 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
c130: 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
c140: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
c150: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c160: 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
c170: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
c180: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
c190: 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
c1a0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
c1b0: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
c1c0: 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
c1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
c1e0: 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
c1f0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
c200: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
c210: 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
c220: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
c230: 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
c240: 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
c250: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
c260: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
c270: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
c280: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
c290: 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
c2a0: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
c2b0: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
c2c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c2d0: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
c2e0: 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
c2f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
c300: 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
c310: 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
c320: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
c330: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
c340: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
c360: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
c370: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
c380: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
c390: 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
c3a0: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
c3b0: 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
c3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
c3d0: 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
c3e0: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
c3f0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
c400: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
c410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c450: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
c460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c470: 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
c4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4c0: 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
c4d0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
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 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
c500: 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
c510: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
c520: 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61   uses the exista
c530: 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
c540: 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e  lock.** files in
c550: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f   order to contro
c560: 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
c570: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
c580: 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a  works on just.**
c590: 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c   about every fil
c5a0: 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62  esystem imaginab
c5b0: 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  le.  But there a
c5c0: 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73  re serious downs
c5d0: 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ides:.**.**    (
c5e0: 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72  1)  There is zer
c5f0: 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20  o concurrency.  
c600: 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20  A single reader 
c610: 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72  blocks all other
c620: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e  .**         conn
c630: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61  ections from rea
c640: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
c650: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
c660: 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61  .**    (2)  An a
c670: 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68  pplication crash
c680: 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63   or power loss c
c690: 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c  an leave stale l
c6a0: 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20  ock files.**    
c6b0: 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f       sitting aro
c6c0: 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f  und that need to
c6d0: 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75   be cleared manu
c6e0: 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65  ally..**.** Neve
c6f0: 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c  rtheless, a dotl
c700: 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ock is an approp
c710: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f  riate locking mo
c720: 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f  de for use if no
c730: 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
c740: 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76  g strategy is av
c750: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44  ailable..**.** D
c760: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77  otfile locking w
c770: 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67  orks by creating
c780: 20 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73   a file in the s
c790: 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
c7a0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
c7b0: 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61   and with the sa
c7c0: 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68  me name but with
c7d0: 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e   a ".lock" exten
c7e0: 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54  sion added..** T
c7f0: 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
c800: 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c  a lock file impl
c810: 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
c820: 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
c830: 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20  r lock.** types 
c840: 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
c850: 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
c860: 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
c870: 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
c880: 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
c890: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
c8a0: 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
c8b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
c8c0: 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
c8d0: 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
c8e0: 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20   DOTLOCK_SUFFIX 
c8f0: 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54  ".lock"../*.** T
c900: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
c910: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
c920: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
c930: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
c940: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
c950: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
c960: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
c970: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
c980: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
c990: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
c9a0: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
c9b0: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
c9c0: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
c9d0: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
c9e0: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
c9f0: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
ca00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
ca10: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
ca20: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74  ng..**.** In dot
ca30: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69  file locking, ei
ca40: 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73  ther a lock exis
ca50: 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f  ts or it does no
ca60: 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a  t.  So in this.*
ca70: 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43  * variation of C
ca80: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
ca90: 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20  (), *pResOut is 
caa0: 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  set to true if a
cab0: 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65  ny lock.** is he
cac0: 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61  ld on the file a
cad0: 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  nd false if the 
cae0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
caf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cb00: 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
cb10: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
cb20: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
cb30: 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
cb40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cb50: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
cb60: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
cb70: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
cb80: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
cb90: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
cba0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
cbb0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
cbc0: 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
cbd0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
cbe0: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
cbf0: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
cc00: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
cc10: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
cc20: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
cc30: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
cc40: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69     /* Either thi
cc50: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  s connection or 
cc60: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
cc70: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d  ction in the sam
cc80: 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  e process.    **
cc90: 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e   holds a lock on
cca0: 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e   the file.  No n
ccb0: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72  eed to check fur
ccc0: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73  ther. */.    res
ccd0: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  erved = 1;.  }el
cce0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c  se{.    /* The l
ccf0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61  ock is held if a
cd00: 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c  nd only if the l
cd10: 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a  ockfile exists *
cd20: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
cd30: 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
cd40: 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65  onst char*)pFile
cd50: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
cd60: 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  ;.    reserved =
cd70: 20 61 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c   access(zLockFil
cd80: 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
cd90: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
cda0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
cdb0: 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
cdc0: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
cdd0: 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
cde0: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
cdf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ce00: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
ce10: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
ce20: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
ce30: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
ce40: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
ce50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
ce60: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
ce70: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
ce80: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
ce90: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
cea0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
ceb0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
cec0: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
ced0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
cee0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
cef0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
cf00: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
cf10: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
cf20: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
cf30: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
cf40: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
cf50: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
cf60: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
cf70: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
cf80: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
cf90: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
cfa0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
cfb0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
cfc0: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
cfd0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
cfe0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
cff0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
d000: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
d010: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
d020: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
d030: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
d040: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
d050: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
d060: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
d070: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
d080: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
d090: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
d0a0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
d0b0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
d0c0: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
d0d0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
d0e0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
d0f0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
d100: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
d110: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
d120: 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
d130: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
d140: 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
d150: 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
d160: 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
d170: 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
d180: 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
d190: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
d1a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
d1b0: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
d1c0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
d1d0: 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
d1e0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
d1f0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
d200: 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 2a  int fd;.  char *
d210: 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
d220: 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
d230: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
d240: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d250: 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61  ...  /* If we ha
d260: 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65  ve any lock, the
d270: 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  n the lock file 
d280: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
d290: 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   All we have.  *
d2a0: 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73  * to do is adjus
d2b0: 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72  t our internal r
d2c0: 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63  ecord of the loc
d2d0: 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20  k level..  */.  
d2e0: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d2f0: 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29  Lock > NO_LOCK )
d300: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
d310: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
d320: 63 6b 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f  ck;.#if !OS_VXWO
d330: 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79  RKS.    /* Alway
d340: 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d  s update the tim
d350: 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c  estamp on the ol
d360: 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74  d file */.    ut
d370: 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
d380: 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
d390: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d3a0: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
d3b0: 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
d3c0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d  e lock */.  fd =
d3d0: 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c   open(zLockFile,
d3e0: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54  O_RDONLY|O_CREAT
d3f0: 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20  |O_EXCL,0600);. 
d400: 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
d410: 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
d420: 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
d430: 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  le, someone else
d440: 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e   may have stolen
d450: 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
d460: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
d470: 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
d480: 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
d490: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
d4a0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
d4b0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
d4c0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d4d0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d4e0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
d4f0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
d500: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
d510: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
d520: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d530: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
d540: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
d550: 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69 66 28  n rc;.  } .  if(
d560: 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20 20   close(fd) ){.  
d570: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d580: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d590: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
d5a0: 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20 20 0a  R_CLOSE;.  }.  .
d5b0: 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
d5c0: 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
d5d0: 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
d5e0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d5f0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
d600: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d610: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
d620: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
d630: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
d640: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
d650: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
d660: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
d670: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
d680: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
d690: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
d6a0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
d6b0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
d6c0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
d6d0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d6e0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
d6f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
d700: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
d710: 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
d720: 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
d730: 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
d740: 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
d750: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
d760: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
d770: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
d780: 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
d790: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
d7a0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
d7b0: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
d7c0: 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
d7d0: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
d7e0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
d7f0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
d800: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
d810: 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
d820: 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
d830: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09  >h, eFileLock,..
d840: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
d850: 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
d860: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
d870: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
d880: 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
d890: 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
d8a0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
d8b0: 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
d8c0: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
d8d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
d8e0: 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72  ..  /* To downgr
d8f0: 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73  ade to shared, s
d900: 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72  imply update our
d910: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e   internal notion
d920: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63   of the.  ** loc
d930: 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65  k state.  No nee
d940: 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74  d to mess with t
d950: 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
d960: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
d970: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d980: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
d990: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
d9a0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  RED_LOCK;.    re
d9b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d9c0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66    }.  .  /* To f
d9d0: 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20  ully unlock the 
d9e0: 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65  database, delete
d9f0: 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a   the lock file *
da00: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  /.  assert( eFil
da10: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
da20: 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a  ;.  if( unlink(z
da30: 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20  LockFile) ){.   
da40: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20   int rc = 0;.   
da50: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
da60: 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f  rno;.    if( ENO
da70: 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  ENT != tErrno ){
da80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
da90: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
daa0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
dab0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
dac0: 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  K);.    }.    if
dad0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
dae0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
daf0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
db00: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
db10: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
db20: 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
db30: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
db40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
db50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
db60: 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65  se a file.  Make
db70: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68   sure the lock h
db80: 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  as been released
db90: 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e   before closing.
dba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
dbb0: 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  otlockClose(sqli
dbc0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
dbd0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
dbe0: 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
dbf0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
dc00: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64  xFile*)id;.    d
dc10: 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c  otlockUnlock(id,
dc20: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73   NO_LOCK);.    s
dc30: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
dc40: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
dc50: 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  t);.  }.  rc = c
dc60: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
dc70: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
dc80: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
dc90: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
dca0: 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d  dot-file lock im
dcb0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
dcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcd0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
dce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
dd20: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
dd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
dd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
dd90: 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67  in flock Locking
dda0: 20 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 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
ddd0: 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63  flock() system c
dde0: 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c  all to do file l
ddf0: 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c  ocking..**.** fl
de00: 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73  ock() locking is
de10: 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c   like dot-file l
de20: 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74  ocking in that t
de30: 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69  he various.** fi
de40: 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67  ne-grain locking
de50: 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65   levels supporte
de60: 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20  d by SQLite are 
de70: 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a  collapsed into.*
de80: 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75  * a single exclu
de90: 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f  sive lock.  In o
dea0: 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52  ther words, SHAR
deb0: 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e  ED, RESERVED, an
dec0: 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63  d.** PENDING loc
ded0: 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ks are the same 
dee0: 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c  thing as an EXCL
def0: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c  USIVE lock.  SQL
df00: 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72  ite.** still wor
df10: 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74  ks when you do t
df20: 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72  his, but concurr
df30: 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20  ency is reduced 
df40: 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20  since.** only a 
df50: 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
df60: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  an be reading th
df70: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20  e database at a 
df80: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74  time..**.** Omit
df90: 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66   this section if
dfa0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
dfb0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20  OCKING_STYLE is 
dfc0: 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66  turned off or if
dfd0: 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  .** compiling fo
dfe0: 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69  r VXWORKS..*/.#i
dff0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e000: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
e010: 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a   !OS_VXWORKS../*
e020: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e030: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
e040: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
e050: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
e060: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
e070: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
e080: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
e090: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
e0a0: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
e0b0: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
e0c0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
e0d0: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
e0e0: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
e0f0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
e100: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
e110: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
e120: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
e130: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
e140: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
e150: 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
e160: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
e170: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e180: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
e190: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e1a0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
e1b0: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
e1c0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
e1d0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
e1e0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
e1f0: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
e200: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
e210: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
e220: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
e230: 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
e240: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
e250: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
e260: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
e270: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
e280: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
e290: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
e2a0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
e2b0: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
e2c0: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
e2d0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
e2e0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
e2f0: 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
e300: 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
e310: 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
e320: 6e 74 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70  nt lrc = flock(p
e330: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
e340: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
e350: 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20   if( !lrc ){.   
e360: 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f     /* got the lo
e370: 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f  ck, unlock it */
e380: 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 66 6c 6f  .      lrc = flo
e390: 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
e3a0: 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20  K_UN);.      if 
e3b0: 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20  ( lrc ) {.      
e3c0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
e3d0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rrno;.        /*
e3e0: 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77   unlock failed w
e3f0: 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ith an error */.
e400: 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71          lrc = sq
e410: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
e420: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
e430: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
e440: 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20 69  OCK); .        i
e450: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e460: 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
e470: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e480: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
e490: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
e4a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e4b0: 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
e4c0: 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
e4d0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e4e0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
e4f0: 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
e500: 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
e510: 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
e520: 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
e530: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
e540: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
e550: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
e560: 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
e570: 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
e580: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
e590: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
e5a0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rno;.        rc 
e5b0: 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
e5c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
e5d0: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
e5e0: 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
e5f0: 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
e600: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
e610: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e620: 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
e630: 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
e640: 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
e650: 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
e660: 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
e670: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65  QLITE_OK;.    re
e680: 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65  served=1;.  }.#e
e690: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
e6a0: 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
e6b0: 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52  _ERRORS */.  *pR
e6c0: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
e6d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e6e0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
e6f0: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
e700: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
e710: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
e720: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
e730: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
e740: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
e750: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
e760: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
e770: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
e780: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
e790: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
e7a0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
e7b0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
e7c0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
e7d0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
e7e0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
e7f0: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
e800: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
e810: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
e820: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
e830: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
e840: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
e850: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
e860: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
e870: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
e880: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
e890: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
e8a0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
e8b0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
e8c0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
e8d0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
e8e0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
e8f0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
e900: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
e910: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
e920: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
e930: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
e940: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
e950: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
e960: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
e970: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
e980: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
e990: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
e9a0: 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
e9b0: 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
e9c0: 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
e9d0: 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
e9e0: 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
e9f0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
ea00: 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
ea10: 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
ea20: 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
ea30: 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
ea40: 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
ea50: 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
ea60: 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
ea70: 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
ea80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ea90: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
eaa0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
eab0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
eac0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
ead0: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
eae0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
eaf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
eb00: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
eb10: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
eb20: 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
eb30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
eb40: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
eb50: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
eb60: 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
eb70: 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66  File );..  /* if
eb80: 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
eb90: 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
eba0: 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
ebb0: 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
ebc0: 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
ebd0: 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
ebe0: 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
ebf0: 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
ec00: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
ec10: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
ec20: 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
ec30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
ec40: 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
ec50: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
ec60: 20 20 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28 70    .  if (flock(p
ec70: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
ec80: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
ec90: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
eca0: 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
ecb0: 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
ecc0: 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
ecd0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
ece0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
ecf0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
ed00: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
ed10: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
ed20: 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
ed30: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
ed40: 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  Errno;.    }.  }
ed50: 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
ed60: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
ed70: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
ed80: 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
ed90: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
eda0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54  eLock;.  }.  OST
edb0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
edc0: 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c  d %s %s (flock)\
edd0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
ede0: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
edf0: 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ck), .          
ee00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
ee10: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
ee20: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
ee30: 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
ee40: 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
ee50: 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
ee60: 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
ee70: 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
ee80: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
ee90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
eea0: 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
eeb0: 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
eec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
eed0: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
eee0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
eef0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ef00: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
ef10: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
ef20: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
ef30: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
ef40: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
ef50: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
ef60: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
ef70: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
ef80: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
ef90: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
efa0: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
efb0: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
efc0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
efd0: 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55  tatic int flockU
efe0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
eff0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
f000: 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
f010: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
f020: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
f030: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
f040: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
f050: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
f060: 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b  %d pid=%d (flock
f070: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
f080: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
f090: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
f0a0: 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
f0b0: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
f0c0: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
f0d0: 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
f0e0: 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
f0f0: 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
f100: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
f110: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
f120: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f130: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
f140: 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
f150: 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
f160: 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
f170: 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
f180: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
f190: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
f1a0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
f1b0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
f1c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f1d0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
f1e0: 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b  , really, unlock
f1f0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  . */.  int rc = 
f200: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
f210: 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28  LOCK_UN);.  if (
f220: 72 63 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 2c  rc) {.    int r,
f230: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
f240: 0a 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 45  .    r = sqliteE
f250: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
f260: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
f270: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
f280: 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
f290: 5f 45 52 52 4f 52 28 72 29 20 29 7b 0a 20 20 20  _ERROR(r) ){.   
f2a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f2b0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
f2c0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
f2d0: 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
f2e0: 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 69  OCK_ERRORS.    i
f2f0: 66 28 20 28 72 20 26 20 53 51 4c 49 54 45 5f 49  f( (r & SQLITE_I
f300: 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
f310: 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 72  IOERR ){.      r
f320: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
f330: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
f340: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
f350: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
f360: 2a 2f 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75  */.    .    retu
f370: 72 6e 20 72 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rn r;.  } else {
f380: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
f390: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
f3a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f3b0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
f3c0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
f3d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f3e0: 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  flockClose(sqlit
f3f0: 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
f400: 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66   if( id ){.    f
f410: 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
f420: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72  O_LOCK);.  }.  r
f430: 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
f440: 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64  ile(id);.}..#end
f450: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
f460: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
f470: 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20  E && !OS_VXWORK 
f480: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
f490: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
f4a0: 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69  the flock lock i
f4b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4d0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f520: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
f590: 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68  gin Named Semaph
f5a0: 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ore Locking ****
f5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5c0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64  ****.**.** Named
f5d0: 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
f5e0: 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f  ng is only suppo
f5f0: 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  rted on VxWorks.
f600: 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
f610: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
f620: 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c   dot-lock and fl
f630: 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72  ock in that it r
f640: 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75  eally only.** su
f650: 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45  pports EXCLUSIVE
f660: 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20   locking.  Only 
f670: 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
f680: 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69   can read or wri
f690: 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  te.** the databa
f6a0: 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d  se file at a tim
f6b0: 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  e.  This reduces
f6c0: 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75   potential concu
f6d0: 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d  rrency, but.** m
f6e0: 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d  akes the lock im
f6f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63  plementation muc
f700: 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66  h easier..*/.#if
f710: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a   OS_VXWORKS../*.
f720: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f730: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
f740: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
f750: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
f760: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
f770: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
f780: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
f790: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
f7a0: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
f7b0: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
f7c0: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
f7d0: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
f7e0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
f7f0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
f800: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
f810: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
f820: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
f830: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
f840: 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
f850: 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65  c int semCheckRe
f860: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
f870: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f880: 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
f890: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f8a0: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
f8b0: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
f8c0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
f8d0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
f8e0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
f8f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f900: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
f910: 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
f920: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
f930: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
f940: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
f950: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
f960: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
f970: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
f980: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
f990: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
f9a0: 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
f9b0: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
f9c0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
f9d0: 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
f9e0: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
f9f0: 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53  ){.    sem_t *pS
fa00: 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
fa10: 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74  de->pSem;.    st
fa20: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75  ruct stat statBu
fa30: 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f  f;..    if( sem_
fa40: 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
fa50: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  1 ){.      int t
fa60: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
fa70: 20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20       if( EAGAIN 
fa80: 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
fa90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
faa0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
fab0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
fac0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
fad0: 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
fae0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
faf0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
fb00: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
fb10: 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e         /* someon
fb20: 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c  e else has the l
fb30: 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20  ock when we are 
fb40: 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  in NO_LOCK */.  
fb50: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
fb60: 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
fb70: 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck < SHARED_LOCK
fb80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
fb90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77  else{.      /* w
fba0: 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20  e could have it 
fbb0: 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f  if we want it */
fbc0: 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28  .      sem_post(
fbd0: 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSem);.    }.  }
fbe0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
fbf0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
fc00: 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
fc10: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
fc20: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
fc30: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
fc40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fc50: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
fc60: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
fc70: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
fc80: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
fc90: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
fca0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
fcb0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
fcc0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
fcd0: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
fce0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
fcf0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
fd00: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
fd10: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
fd20: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
fd30: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
fd40: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
fd50: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
fd60: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
fd70: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
fd80: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
fd90: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
fda0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
fdb0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
fdc0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
fdd0: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
fde0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
fdf0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
fe00: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
fe10: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
fe20: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
fe30: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
fe40: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
fe50: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
fe60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
fe70: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
fe80: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
fe90: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
fea0: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
feb0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
fec0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
fed0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
fee0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
fef0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
ff00: 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  E.**.** Semaphor
ff10: 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61  e locks only rea
ff20: 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
ff30: 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
ff40: 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
ff50: 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
ff60: 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
ff70: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
ff80: 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
ff90: 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
ffa0: 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
ffb0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
ffc0: 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
ffd0: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
ffe0: 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
fff0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
10000 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
10010 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
10020 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
10030 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
10040 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
10050 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
10060 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
10070 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74  nt semLock(sqlit
10080 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
10090 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
100a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
100b0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
100c0 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d  .  int fd;.  sem
100d0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
100e0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
100f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10100 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  E_OK;..  /* if w
10110 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
10120 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
10130 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
10140 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
10150 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
10160 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
10170 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
10180 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
10190 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
101a0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
101b0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
101c0 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73  E_OK;.    goto s
101d0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
101e0 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65  .  .  /* lock se
101f0 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20  maphore now but 
10200 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c  bail out when al
10210 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f  ready locked. */
10220 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61  .  if( sem_trywa
10230 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
10240 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10250 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73  BUSY;.    goto s
10260 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
10270 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73  ..  /* got it, s
10280 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
10290 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
102a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
102b0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73  = eFileLock;.. s
102c0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72  em_end_lock:.  r
102d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
102e0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
102f0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
10300 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
10310 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
10320 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
10330 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
10340 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
10350 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
10360 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
10370 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
10380 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
10390 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
103a0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
103b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
103c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
103d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
103e0 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b  ic int semUnlock
103f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10400 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
10410 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
10420 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10430 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  e*)id;.  sem_t *
10440 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
10450 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61  node->pSem;..  a
10460 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
10470 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29    assert( pSem )
10480 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
10490 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
104a0 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c  %d pid=%d (sem)\
104b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
104c0 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69  ileLock,..   pFi
104d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
104e0 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
104f0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
10500 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
10510 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
10520 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
10530 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
10540 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
10550 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10560 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
10570 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
10580 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
10590 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
105a0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
105b0 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
105c0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
105d0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
105e0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
105f0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
10600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10610 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20    /* no, really 
10620 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20  unlock. */.  if 
10630 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29  ( sem_post(pSem)
10640 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
10650 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72   rc, tErrno = er
10660 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rno;.    rc = sq
10670 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10680 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
10690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
106a0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
106b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
106c0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
106d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
106e0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
106f0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
10700 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10710 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
10720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10730 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
10740 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
10750 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28  ic int semClose(
10760 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10770 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
10780 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
10790 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
107a0 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f  )id;.    semUnlo
107b0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
107c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
107d0 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  le );.    unixEn
107e0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
107f0 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
10800 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69  (pFile);.    uni
10810 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
10820 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65     closeUnixFile
10830 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
10840 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10850 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
10860 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e  WORKS */./*.** N
10870 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
10880 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
10890 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f  vailable on VxWo
108a0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  rks..**.********
108b0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
108c0 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
108d0 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  re lock implemen
108e0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
108f0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20  ***** Begin AFP 
109c0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
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 0a 2a 2a 0a 2a 2a 20  *********.**.** 
109f0 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65  AFP is the Apple
10a00 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c   Filing Protocol
10a10 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77  .  AFP is a netw
10a20 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66  ork filesystem f
10a30 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65  ound.** on Apple
10a40 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75   Macintosh compu
10a50 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20  ters - both OS9 
10a60 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54  and OSX..**.** T
10a70 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65  hird-party imple
10a80 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46  mentations of AF
10a90 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  P are available.
10aa0 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20    But this code 
10ab0 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72  here.** only wor
10ac0 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23  ks on OSX..*/..#
10ad0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
10ae0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
10af0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
10b00 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  TYLE./*.** The a
10b10 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
10b20 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
10b30 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b  ins all afp lock
10b40 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
10b50 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
10b60 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
10b70 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ext afpLockingCo
10b80 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66  ntext;.struct af
10b90 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
10ba0 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  {.  int reserved
10bb0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10bc0 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
10bd0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
10be0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  he open file */.
10bf0 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
10c00 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
10c10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
10c20 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
10c30 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
10c40 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
10c50 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
10c60 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
10c70 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
10c80 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
10c90 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
10ca0 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
10cb0 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
10cc0 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
10cd0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
10ce0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
10cf0 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
10d00 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
10d10 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
10d20 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
10d30 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
10d40 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
10d50 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
10d60 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
10d70 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
10da0 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
10db0 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
10dc0 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
10dd0 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
10de0 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
10df0 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
10e00 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
10e10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
10e20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65  a utility for se
10e30 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e  tting or clearin
10e40 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f  g a bit-range lo
10e50 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20  ck on an.** AFP 
10e60 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a  filesystem..** .
10e70 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
10e80 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  _OK on success, 
10e90 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66  SQLITE_BUSY on f
10ea0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
10eb0 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b  c int afpSetLock
10ec0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
10ed0 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  path,           
10ee0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
10ef0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  e file to be loc
10f00 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20  ked or unlocked 
10f10 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
10f20 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
10f30 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
10f40 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70   descriptor on p
10f50 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ath */.  unsigne
10f60 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
10f70 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  et,     /* First
10f80 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
10f90 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
10fa0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
10fb0 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  h,     /* Number
10fc0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
10fd0 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f  k */.  int setLo
10fe0 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  ckFlag          
10ff0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
11000 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73   set lock.  Fals
11010 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20  e to clear lock 
11020 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42  */.){.  struct B
11030 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20  yteRangeLockPB2 
11040 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20  pb;.  int err;. 
11050 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
11060 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
11070 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
11080 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
11090 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
110a0 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
110b0 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
110c0 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  b.fd = pFile->h;
110d0 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22  .  .  OSTRACE(("
110e0 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20  AFPSETLOCK [%s] 
110f0 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67  for %d%s in rang
11100 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20  e %llx:%llx\n", 
11110 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61  .    (setLockFla
11120 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70  g?"ON":"OFF"), p
11130 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d  File->h, (pb.fd=
11140 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d  =-1?"[testval-1]
11150 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65  ":""),.    offse
11160 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65  t, length));.  e
11170 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c  rr = fsctl(path,
11180 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
11190 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20  ock2FSCTL, &pb, 
111a0 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d  0);.  if ( err==
111b0 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
111c0 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  c;.    int tErrn
111d0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f  o = errno;.    O
111e0 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
111f0 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73  OCK failed to fs
11200 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73  ctl() '%s' %d %s
11210 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11220 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20    path, tErrno, 
11230 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29  strerror(tErrno)
11240 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
11250 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
11260 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20  K_ERRORS.    rc 
11270 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23  = SQLITE_BUSY;.#
11280 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71  else.    rc = sq
11290 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
112a0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a  ixError(tErrno,.
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20      setLockFlag 
112d0 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  ? SQLITE_IOERR_L
112e0 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  OCK : SQLITE_IOE
112f0 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64  RR_UNLOCK);.#end
11300 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
11310 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
11320 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ORS */.    if( I
11330 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
11340 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
11350 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
11360 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
11370 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
11380 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
11390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
113a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
113b0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
113c0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
113d0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
113e0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
113f0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
11400 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
11410 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
11420 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
11430 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
11440 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
11450 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
11460 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
11470 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
11480 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
11490 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
114a0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
114b0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
114c0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
114d0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68  static int afpCh
114e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
114f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11500 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
11510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11520 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
11530 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
11540 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11550 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11560 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11570 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
11580 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
11590 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
115a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
115b0 20 29 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67   );.  afpLocking
115c0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
115d0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
115e0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
115f0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11600 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72    if( context->r
11610 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a  eserved ){.    *
11620 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
11630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11640 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
11650 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
11660 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
11670 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
11680 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
11690 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
116a0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
116b0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
116c0 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
116d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
116e0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
116f0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11700 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
11710 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
11720 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
11730 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
11740 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
11750 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
11760 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
11770 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
11780 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
11790 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
117a0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
117b0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
117c0 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
117d0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
117e0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
117f0 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
11800 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
11810 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
11820 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
11830 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
11840 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
11850 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
11860 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
11870 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
11880 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
11890 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
118a0 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
118b0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
118c0 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
118d0 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
118e0 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
118f0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
11900 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
11910 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
11920 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
11930 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
11940 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
11950 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
11960 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
11970 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
11980 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
11990 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
119a0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
119b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
119c0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
119d0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
119e0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
119f0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
11a00 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
11a10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
11a20 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
11a30 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
11a40 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
11a50 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
11a60 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
11a70 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
11a80 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
11a90 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
11aa0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
11ab0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
11ac0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
11ad0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
11ae0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
11af0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
11b00 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
11b10 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
11b20 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
11b30 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
11b40 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
11b50 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
11b60 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
11b70 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
11b80 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
11b90 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
11ba0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
11bb0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
11bc0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
11bd0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
11be0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
11bf0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
11c00 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
11c10 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
11c20 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
11c30 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
11c40 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
11c50 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
11c60 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
11c70 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
11c80 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
11c90 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
11ca0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
11cb0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
11cc0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
11cd0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
11ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
11cf0 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
11d00 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
11d10 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
11d20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11d30 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
11d40 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
11d50 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
11d60 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
11d70 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
11d80 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
11d90 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
11da0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
11db0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11dc0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
11dd0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
11de0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
11df0 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
11e00 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
11e10 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
11e20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
11e30 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
11e40 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
11e50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
11e60 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
11e70 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
11e80 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
11e90 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
11ea0 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
11eb0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
11ec0 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
11ed0 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
11ee0 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
11ef0 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
11f00 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
11f10 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
11f20 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
11f30 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
11f40 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
11f50 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
11f60 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
11f70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
11f80 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
11f90 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
11fa0 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
11fb0 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70  ready held) (afp
11fc0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
11fd0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
11fe0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
11ff0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
12000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
12010 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
12020 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
12030 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
12040 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
12050 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
12060 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
12070 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
12080 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
12090 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
120a0 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
120b0 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
120c0 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
120d0 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
120e0 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
120f0 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
12100 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
12110 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12120 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
12130 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
12140 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
12150 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
12160 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
12170 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
12180 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
12190 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
121a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
121b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
121c0 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
121d0 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
121e0 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
121f0 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
12200 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
12210 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
12220 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
12230 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
12240 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
12250 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
12260 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
12270 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
12280 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
12290 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
122a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
122b0 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
122c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
122d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
122e0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
122f0 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49  k && .       (pI
12300 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
12310 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
12320 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
12330 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b  D_LOCK)).     ){
12340 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12350 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
12360 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
12370 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53  }.  .  /* If a S
12380 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
12390 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
123a0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
123b0 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
123c0 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
123d0 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
123e0 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
123f0 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
12400 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
12410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
12420 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
12430 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
12440 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64   && .     (pInod
12450 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
12460 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
12470 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
12480 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
12490 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
124a0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
124b0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
124c0 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
124d0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
124e0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
124f0 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
12500 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12510 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
12520 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
12530 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
12540 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
12550 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
12560 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
12570 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
12580 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
12590 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
125a0 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
125b0 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
125c0 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
125d0 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
125e0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
125f0 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
12600 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
12610 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
12620 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
12630 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
12640 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
12650 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
12660 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
12670 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
12680 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
12690 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
126a0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
126b0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
126c0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
126d0 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
126e0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
126f0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
12700 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
12710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
12720 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
12730 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
12740 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
12750 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
12760 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
12770 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
12780 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
12790 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
127a0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
127b0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
127c0 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  t lrc1, lrc2, lr
127d0 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e  c1Errno;.    lon
127e0 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20  g lk, mask;.    
127f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
12800 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
12810 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12820 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
12830 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a  ==0 );.        .
12840 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65      mask = (size
12850 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c  of(long)==8) ? L
12860 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30  ARGEST_INT64 : 0
12870 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f  x7fffffff;.    /
12880 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
12890 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c  ad-lock SHARED_L
128a0 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f  OCK */.    /* no
128b0 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c  te that the qual
128c0 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f  ity of the rando
128d0 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61  mness doesn't ma
128e0 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a  tter that much *
128f0 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f  /.    lk = rando
12900 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65  m(); .    pInode
12910 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28  ->sharedByte = (
12920 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52  lk & mask)%(SHAR
12930 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20  ED_SIZE - 1);.  
12940 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c    lrc1 = afpSetL
12950 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
12960 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
12970 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
12980 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
12990 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  edByte, 1, 1);. 
129a0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
129b0 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20  RROR(lrc1) ){.  
129c0 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20      lrc1Errno = 
129d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
129e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
129f0 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
12a00 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
12a10 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70  /.    lrc2 = afp
12a20 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
12a30 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
12a40 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
12a50 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66   0);.    .    if
12a60 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12a70 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20  lrc1) ) {.      
12a80 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12a90 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20   = lrc1Errno;.  
12aa0 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
12ab0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
12ac0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
12ad0 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
12ae0 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
12af0 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
12b00 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
12b10 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
12b20 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
12b30 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
12b40 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
12b50 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
12b60 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12b70 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
12b80 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
12b90 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
12ba0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
12bb0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
12bc0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
12bd0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
12be0 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
12bf0 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
12c00 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
12c10 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
12c20 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
12c30 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
12c40 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
12c50 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
12c60 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
12c70 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
12c80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
12c90 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
12ca0 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
12cb0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
12cc0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
12cd0 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
12ce0 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
12cf0 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
12d00 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
12d10 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
12d20 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
12d30 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
12d40 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
12d50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12d60 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c   );.    if (eFil
12d70 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45  eLock >= RESERVE
12d80 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
12d90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53  >eFileLock < RES
12da0 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
12db0 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
12dc0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
12dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
12de0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
12df0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
12e00 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
12e10 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
12e20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29     if( !failed )
12e30 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78  {.        contex
12e40 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b  t->reserved = 1;
12e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12e60 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
12e70 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45  & eFileLock == E
12e80 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
12e90 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72  .      /* Acquir
12ea0 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
12eb0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a  ock */.        .
12ec0 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
12ed0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
12ee0 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68  before trying th
12ef0 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20  e range.  we'll 
12f00 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a  need to .      *
12f10 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  * reestablish th
12f20 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
12f30 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68   we can't get th
12f40 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20  e  afpUnlock.   
12f50 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
12f60 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65  !(failed = afpSe
12f70 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
12f80 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
12f90 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fb0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68        pInode->sh
12fc0 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
12fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
12fe0 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
12ff0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
13000 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
13010 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
13020 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
13030 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
13040 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
13050 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
13060 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
13070 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
130a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
130b0 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
130c0 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
130d0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
130e0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13100 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49  HARED_FIRST + pI
13110 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
13120 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
13130 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
13140 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
13150 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
13160 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
13170 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
13180 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
13190 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
131a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
131b0 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
131c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
131d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
131e0 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
131f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13200 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
13210 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
13220 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
13230 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
13240 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13250 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
13260 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13270 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
13280 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
13290 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
132a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
132b0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
132c0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
132d0 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
132e0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
132f0 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
13300 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
13310 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
13320 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13330 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
13340 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
13350 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
13360 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
13370 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
13380 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
13390 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
133a0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
133b0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
133c0 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
133d0 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
133e0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
133f0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
13400 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
13410 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
13420 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
13430 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
13440 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
13450 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
13460 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
13470 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
13480 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
13490 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
134a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
134b0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
134c0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
134d0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
134e0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
134f0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
13500 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
13510 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
13520 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69  t afpUnlock(sqli
13530 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13540 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13550 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13560 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
13570 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13580 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
13590 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
135a0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
135b0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
135c0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
135d0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
135e0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
135f0 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
13600 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
13610 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
13620 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
13630 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
13640 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
13650 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
13660 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
13670 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
13680 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
13690 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
136a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
136b0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
136c0 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
136d0 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
136e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74  ,.           get
136f0 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65  pid()));..  asse
13700 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
13710 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
13720 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13730 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
13740 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13750 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
13760 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
13770 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
13780 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
13790 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
137a0 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
137b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
137c0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
137d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
137e0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
137f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13800 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65   );.    Simulate
13810 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
13820 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
13830 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
13840 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
13850 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
13860 20 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55    .#ifndef NDEBU
13870 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
13880 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
13890 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
138a0 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
138b0 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
138c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
138d0 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
138e0 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
138f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13900 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
13910 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
13920 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
13930 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
13940 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
13950 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
13960 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
13970 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
13980 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
13990 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
139a0 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
139b0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
139c0 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
139d0 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
139e0 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
139f0 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
13a00 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
13a10 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
13a20 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
13a30 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
13a40 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
13a50 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
13a60 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
13a70 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
13a80 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
13a90 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
13aa0 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
13ab0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   );.    pFile->i
13ac0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
13ad0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
13ae0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13af0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
13b00 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
13b10 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
13b20 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
13b30 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
13b40 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
13b50 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
13b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13b70 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
13b80 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
13b90 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20  ode->nShared>1) 
13ba0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e  ){.        /* on
13bb0 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  ly re-establish 
13bc0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
13bd0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
13be0 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72          int shar
13bf0 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
13c00 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
13c10 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
13c20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
13c30 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
13c40 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
13c50 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
13c60 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73   1);.      } els
13c70 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70  e {.        skip
13c80 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
13c90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13ca0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13cb0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
13cc0 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
13cd0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13ce0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13cf0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13d00 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
13d10 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
13d20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13d30 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
13d40 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  FileLock>=RESERV
13d50 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65  ED_LOCK && conte
13d60 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
13d70 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
13d80 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
13d90 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
13da0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
13db0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  0);.      if( !r
13dc0 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f  c ){ .        co
13dd0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
13de0 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  = 0; .      }.  
13df0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
13e00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
13e10 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
13e20 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
13e30 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20  nShared>1)){.   
13e40 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
13e50 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
13e60 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
13e70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13e80 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K && eFileLock==
13e90 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  NO_LOCK ){..    
13ea0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
13eb0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
13ec0 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
13ed0 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
13ee0 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
13ef0 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
13f00 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
13f10 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
13f20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
13f30 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
13f40 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
13f50 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
13f60 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
13f70 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
13f80 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49  aredByte;.    pI
13f90 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
13fa0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
13fb0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
13fc0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
13fd0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
13fe0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
13ff0 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
14000 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
14010 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
14020 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68       if( !skipSh
14030 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ared ){.        
14040 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
14050 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
14060 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
14070 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
14080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14090 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
140a0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
140b0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
140c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
140d0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
140e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
140f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
14110 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
14120 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
14130 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
14140 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
14150 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
14160 20 20 20 20 20 20 20 72 63 20 3d 20 63 6c 6f 73         rc = clos
14170 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
14180 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
14190 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
141a0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
141b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
141c0 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
141d0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
141e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
141f0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
14200 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46  ile & cleanup AF
14210 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  P specific locki
14220 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73  ng context .*/.s
14230 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f  tatic int afpClo
14240 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
14250 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
14260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
14270 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
14280 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14290 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
142a0 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20    afpUnlock(id, 
142b0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e  NO_LOCK);.    un
142c0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
142d0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
142e0 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e  Inode && pFile->
142f0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
14300 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
14310 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
14320 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
14330 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
14340 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
14350 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
14360 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
14370 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
14380 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
14390 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
143a0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
143b0 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e  Inode->aPending.
143c0 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
143d0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
143e0 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  d when.      ** 
143f0 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
14400 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
14410 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64  */.      setPend
14420 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
14430 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49    }.    releaseI
14440 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
14450 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14460 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
14470 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63  Context);.    rc
14480 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
14490 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  (id);.    unixLe
144a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
144b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
144c0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
144d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
144e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
144f0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
14500 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
14510 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
14520 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
14530 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
14540 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
14550 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
14560 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
14570 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
14580 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
14590 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
145a0 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
145b0 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
145c0 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
145d0 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
145e0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
145f0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
14600 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
14610 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
14620 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
14650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14690 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
146f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14700 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
14710 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
14720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14730 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
14740 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
14750 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
14760 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
14770 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
14780 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
14790 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
147a0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
147b0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
147c0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
147d0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
147e0 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
147f0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
14800 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
14810 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
14820 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
14830 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
14840 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
14850 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
14860 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
14870 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
14880 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
14890 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
148a0 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
148b0 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64   _posixUnlock(id
148c0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
148d0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
148e0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
148f0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
14900 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
14910 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
14920 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
14930 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
14940 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
14950 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
14960 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
14970 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
14980 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
14990 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
149a0 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
149b0 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
149c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149d0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
149e0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
149f0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
14a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
14a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a70 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a  ************.***
14ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
14ac0 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
14ad0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
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 0a 2a 2a 0a  ************.**.
14b00 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
14b10 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
14b20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
14b30 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
14b40 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
14b50 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
14b60 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
14b70 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
14b80 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
14b90 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
14ba0 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
14bb0 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
14bc0 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
14bd0 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
14be0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
14bf0 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
14c00 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
14c10 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
14c20 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
14c30 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
14c40 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
14c50 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
14c60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14c70 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
14c80 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
14c90 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
14ca0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
14cb0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
14cc0 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
14cd0 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
14ce0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
14cf0 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
14d00 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
14d10 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
14d20 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
14d30 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
14d40 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
14d50 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
14d60 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
14d70 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
14d80 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
14d90 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20  ** any any form 
14da0 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
14db0 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
14dc0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
14dd0 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
14de0 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
14df0 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
14e00 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
14e10 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
14e20 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
14e30 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
14e40 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
14e50 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
14e60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14e70 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
14e80 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
14e90 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
14ea0 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
14eb0 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
14ec0 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
14ed0 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
14ee0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
14ef0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
14f00 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
14f10 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
14f20 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
14f30 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28  ).  got = pread(
14f40 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
14f50 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d  , offset);.  Sim
14f60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
14f70 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20  t = -1 );.#elif 
14f80 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
14f90 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65  D64).  got = pre
14fa0 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
14fb0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
14fc0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14fd0 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
14fe0 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
14ff0 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
15000 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
15010 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
15020 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
15030 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66  - );.  if( newOf
15040 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
15050 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
15060 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
15070 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
15080 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
15090 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rno;.    }else{.
150a0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
150b0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
150c0 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20   = 0;....    }. 
150d0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
150e0 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  }.  got = read(i
150f0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
15100 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
15110 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
15120 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
15130 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
15140 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
15150 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
15160 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
15170 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
15180 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
15190 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
151a0 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
151b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
151c0 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
151d0 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
151e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
151f0 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
15200 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
15210 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
15220 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
15230 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
15240 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15250 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
15260 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
15270 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
15280 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
15290 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
152a0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
152b0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
152c0 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f  e *)id;.  int go
152d0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
152e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
152f0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
15300 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
15310 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
15320 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
15330 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
15340 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
15350 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
15360 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
15370 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
15380 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
15390 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
153a0 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
153b0 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
153c0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
153d0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
153e0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
153f0 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
15400 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
15410 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
15420 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
15430 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15440 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
15450 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
15460 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
15470 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
15480 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
15490 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
154a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
154b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
154c0 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
154d0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
154e0 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
154f0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
15500 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
15510 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
15520 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
15530 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
15540 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15550 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
15560 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
15570 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
15580 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
15590 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
155a0 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
155b0 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
155c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
155d0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
155e0 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
155f0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
15600 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
15610 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
15620 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
15630 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
15640 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
15650 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
15660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
15670 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
15680 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
15690 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
156a0 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
156b0 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28    int got;.#if (
156c0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
156d0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
156e0 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
156f0 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
15700 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
15710 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
15720 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f  (USE_PREAD).  go
15730 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d 3e 68  t = pwrite(id->h
15740 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
15750 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  set);.#elif defi
15760 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
15770 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 36  .  got = pwrite6
15780 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
15790 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c  nt, offset);.#el
157a0 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  se.  newOffset =
157b0 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
157c0 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
157d0 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
157e0 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
157f0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
15800 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
15810 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
15820 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
15830 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15840 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
15850 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
15860 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
15870 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
15880 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64 2d 3e  got = write(id->
15890 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
158a0 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
158b0 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
158c0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
158d0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
158e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20   = errno;.  }.. 
158f0 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
15900 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
15910 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68  d %llu\n", id->h
15920 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54  , got, offset, T
15930 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
15940 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
15950 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
15960 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
15970 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
15980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
15990 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
159a0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
159b0 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
159c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
159d0 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
159e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
159f0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
15a00 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
15a10 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
15a20 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
15a30 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15a40 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15a50 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
15a60 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
15a70 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
15a80 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
15a90 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
15aa0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
15ab0 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
15ac0 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
15ad0 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
15ae0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
15af0 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
15b00 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
15b10 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
15b20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
15b30 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
15b40 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
15b50 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
15b60 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
15b70 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
15b80 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
15b90 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
15ba0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
15bb0 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
15bc0 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
15bd0 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
15be0 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20  d to.  ** doing 
15bf0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15c00 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
15c10 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
15c20 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a  ther than a.  **
15c30 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
15c40 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f   file) then reco
15c50 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
15c60 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
15c70 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ** has changed. 
15c80 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
15c90 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d  ion counter is m
15ca0 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20  odified, record 
15cb0 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74  that.  ** fact t
15cc0 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  oo..  */.  if( p
15cd0 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
15ce0 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ite ){.    pFile
15cf0 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20  ->dbUpdate = 1; 
15d00 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
15d10 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
15d20 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  ed */.    if( of
15d30 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73  fset<=24 && offs
15d40 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20  et+amt>=27 ){.  
15d50 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
15d60 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34    char oldCntr[4
15d70 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ];.      Simulat
15d80 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
15d90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
15da0 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
15db0 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29   24, oldCntr, 4)
15dc0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
15dd0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
15de0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15df0 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43  4 || memcmp(oldC
15e00 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42  ntr, &((char*)pB
15e10 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20  uf)[24-offset], 
15e20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)!=0 ){.       
15e30 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
15e40 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54  rChng = 1;  /* T
15e50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
15e60 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67  ounter has chang
15e70 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ed */.      }.  
15e80 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
15e90 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
15ea0 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  & (wrote = seekA
15eb0 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f  ndWrite(pFile, o
15ec0 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
15ed0 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
15ee0 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
15ef0 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
15f00 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
15f10 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
15f20 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
15f30 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
15f40 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
15f50 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
15f60 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
15f70 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66  , amt=1 ));.  if
15f80 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
15f90 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20  f( wrote<0 ){.  
15fa0 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
15fb0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57   set by seekAndW
15fc0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  rite */.      re
15fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15fe0 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
15ff0 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
16000 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
16010 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
16020 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
16030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
16040 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
16050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16060 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
16070 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
16080 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
16090 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
160a0 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
160b0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
160c0 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
160d0 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
160e0 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
160f0 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
16100 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
16110 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
16120 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
16130 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
16140 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
16150 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
16160 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
16170 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
16180 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
16190 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
161a0 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
161b0 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
161c0 74 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29 20  th the (slower) 
161d0 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79  fsync()..** If y
161e0 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
161f0 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
16200 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
16210 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
16220 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
16230 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
16240 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
16250 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
16260 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 64 65  datasync) && !de
16270 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
16280 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
16290 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
162a0 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
162b0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
162c0 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
162d0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
162e0 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
162f0 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
16300 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
16310 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
16320 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
16330 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
16340 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
16350 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
16360 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
16370 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
16380 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
16390 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
163a0 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
163b0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
163c0 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
163d0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
163e0 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
163f0 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
16400 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
16410 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
16420 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
16430 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
16440 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
16450 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
16460 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
16470 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
16480 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
16490 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
164a0 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
164b0 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
164c0 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
164d0 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
164e0 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
164f0 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
16500 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
16510 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
16520 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
16530 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
16540 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
16550 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
16560 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
16570 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
16580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
16590 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
165a0 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
165b0 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
165c0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
165d0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
165e0 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
165f0 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
16600 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
16610 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
16620 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
16630 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
16640 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
16650 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
16660 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
16670 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
16680 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
16690 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
166a0 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
166b0 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
166c0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
166d0 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
166e0 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
166f0 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
16700 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
16710 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
16720 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
16730 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
16740 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
16750 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
16760 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
16770 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
16780 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
16790 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
167a0 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
167b0 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
167c0 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
167d0 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
167e0 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
167f0 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
16800 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
16810 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
16820 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
16830 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
16840 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
16850 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
16860 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
16870 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
16880 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
16890 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
168a0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
168b0 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
168c0 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
168d0 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
168e0 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
168f0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
16900 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
16910 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
16920 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
16930 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
16940 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
16950 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
16960 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
16970 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
16980 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
16990 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
169a0 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
169b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
169c0 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
169d0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
169e0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
169f0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
16a00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
16a10 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
16a20 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
16a30 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
16a40 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
16a50 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
16a60 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
16a70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
16a80 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
16a90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
16aa0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
16ab0 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
16ac0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
16ad0 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
16ae0 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
16af0 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
16b00 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
16b10 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
16b20 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
16b30 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
16b40 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
16b50 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
16b60 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
16b70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16b80 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
16b90 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
16ba0 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
16bb0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
16bc0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
16bd0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
16be0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
16bf0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
16c00 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
16c10 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
16c20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16c30 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
16c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
16c50 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
16c60 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
16c70 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c  {.    rc = fcntl
16c80 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
16c90 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
16ca0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
16cb0 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
16cc0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
16cd0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
16ce0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
16cf0 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
16d00 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
16d10 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
16d20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
16d30 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
16d40 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
16d50 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
16d60 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
16d70 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
16d80 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
16d90 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
16da0 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
16db0 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
16dc0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
16dd0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
16de0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
16df0 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
16e00 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
16e10 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
16e20 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
16e30 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
16e40 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
16e50 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
16e60 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
16e70 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
16e80 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
16e90 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
16ea0 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
16eb0 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
16ec0 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
16ed0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
16ee0 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
16ef0 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
16f00 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
16f10 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
16f20 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
16f30 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
16f40 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
16f50 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
16f60 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
16f70 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
16f80 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
16f90 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
16fa0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
16fb0 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
16fc0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
16fd0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
16fe0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
16ff0 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
17000 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
17010 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
17020 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
17030 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
17040 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17050 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
17060 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
17070 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
17080 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
17090 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
170a0 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
170b0 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
170c0 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
170d0 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
170e0 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
170f0 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
17100 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
17110 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
17120 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
17130 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
17140 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
17150 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
17160 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
17170 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
17180 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
17190 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
171a0 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
171b0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
171c0 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
171d0 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
171e0 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
171f0 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
17200 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
17210 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
17220 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
17230 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
17240 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
17250 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
17260 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
17270 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
17280 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
17290 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
172a0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
172b0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
172c0 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
172d0 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
172e0 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
172f0 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
17300 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
17310 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
17320 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
17330 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
17340 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17350 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
17360 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
17370 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
17380 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
17390 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
173a0 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
173b0 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
173c0 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
173d0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
173e0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
173f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
17400 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
17410 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
17420 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
17430 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
17440 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
17450 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
17460 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
17470 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
17480 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
17490 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
174a0 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
174b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
174c0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
174d0 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
174e0 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
174f0 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
17500 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
17510 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
17520 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
17530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
17540 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
17550 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
17560 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
17570 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
17580 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
17590 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
175a0 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
175b0 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
175c0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
175d0 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
175e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
175f0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
17600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17610 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d  IOERR_FSYNC;.  }
17620 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69  .  if( pFile->di
17630 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  rfd>=0 ){.    in
17640 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54 52 41  t err;.    OSTRA
17650 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 2d 33  CE(("DIRSYNC %-3
17660 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  d (have_fullfsyn
17670 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
17680 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72  )\n", pFile->dir
17690 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
176a0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
176b0 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 23 69  isFullsync));.#i
176c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
176d0 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20  ABLE_DIRSYNC.   
176e0 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72   /* The director
176f0 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61  y sync is only a
17700 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c  ttempted if full
17710 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a  _fsync is.    **
17720 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75   turned off or u
17730 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20  navailable.  If 
17740 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63  a full_fsync occ
17750 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20  urred above,.   
17760 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72   ** then the dir
17770 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73  ectory sync is s
17780 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20  uperfluous..    
17790 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41 56  */.    if( (!HAV
177a0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21  E_FULLFSYNC || !
177b0 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66  isFullsync) && f
177c0 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
177d0 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20  >dirfd,0,0) ){. 
177e0 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
177f0 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69  ** We have recei
17800 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70  ved multiple rep
17810 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20  orts of fsync() 
17820 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  returning.      
17830 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20   ** errors when 
17840 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63  applied to direc
17850 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69  tories on certai
17860 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a  n file systems..
17870 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c         ** A fail
17880 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  ed directory syn
17890 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64  c is not a big d
178a0 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d  eal.  So it seem
178b0 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74  s.       ** bett
178c0 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  er to ignore the
178d0 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20   error.  Ticket 
178e0 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a  #1657.       */.
178f0 20 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d         /* pFile-
17900 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17910 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a  no; */.       /*
17920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17930 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23  OERR; */.    }.#
17940 65 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d 20  endif.    err = 
17950 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
17960 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  fd); /* Only nee
17970 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
17980 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f 0a  so close the */.
17990 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
179a0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  {              /
179b0 2a 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e  * directory when
179c0 20 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a   we are done */.
179d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72        pFile->dir
179e0 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  fd = -1;.    }el
179f0 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
17a00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17a10 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
17a20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
17a30 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  CLOSE;.    }.  }
17a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17a50 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
17a60 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
17a70 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
17a80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
17a90 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69  nixTruncate(sqli
17aa0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
17ab0 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20  4 nByte){.  int 
17ac0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
17ad0 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
17ae0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
17af0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
17b00 41 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 66 74  ATE );.  rc = ft
17b10 72 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46 69  runcate(((unixFi
17b20 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66 66  le*)id)->h, (off
17b30 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  _t)nByte);.  if(
17b40 20 72 63 20 29 7b 0a 20 20 20 20 28 28 75 6e 69   rc ){.    ((uni
17b50 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
17b60 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
17b70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17b80 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b  _IOERR_TRUNCATE;
17b90 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65  .  }else{.#ifnde
17ba0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
17bb0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
17bc0 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
17bd0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
17be0 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
17bf0 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
17c00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17c10 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
17c20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
17c30 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
17c40 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
17c50 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
17c60 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
17c70 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
17c80 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
17c90 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
17ca0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
17cb0 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
17cc0 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
17cd0 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
17ce0 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
17cf0 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
17d00 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
17d10 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
17d20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28     */.    if( ((
17d30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 69  unixFile*)id)->i
17d40 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
17d50 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
17d60 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
17d70 29 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  )->transCntrChng
17d80 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
17d90 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
17da0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
17db0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
17dc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
17dd0 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
17de0 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
17df0 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
17e00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17e10 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
17e20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
17e30 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
17e40 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
17e50 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46   = fstat(((unixF
17e60 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
17e70 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
17e80 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
17e90 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
17ea0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
17eb0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
17ec0 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
17ed0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
17ee0 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
17ef0 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
17f00 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
17f10 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
17f20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
17f30 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
17f40 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
17f50 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
17f60 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
17f70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
17f80 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
17f90 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
17fa0 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
17fb0 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
17fc0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
17fd0 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
17fe0 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
17ff0 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
18000 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
18010 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
18020 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
18030 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
18040 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
18050 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
18060 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
18070 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
18080 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
18090 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
180a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
180b0 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
180c0 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
180d0 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
180e0 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
180f0 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
18100 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
18110 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
18120 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
18130 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
18140 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
18150 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  );.#endif.../*.*
18160 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
18170 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
18180 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
18190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
181a0 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
181b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
181c0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
181d0 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28  pArg){.  switch(
181e0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
181f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
18200 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
18210 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28  *(int*)pArg = ((
18220 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 65  unixFile*)id)->e
18230 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  FileLock;.      
18240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18260 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
18270 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
18280 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78  t*)pArg = ((unix
18290 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
182a0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
182b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
182c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
182d0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
182e0 49 4e 54 3a 20 7b 0a 23 69 66 20 30 20 2f 2a 20  INT: {.#if 0 /* 
182f0 4e 6f 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61  No performance a
18300 64 76 61 6e 74 61 67 65 20 73 65 65 6e 20 6f 6e  dvantage seen on
18310 20 4c 69 6e 75 78 20 2a 2f 0a 20 20 20 20 20 20   Linux */.      
18320 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
18330 46 69 6c 65 20 3d 20 2a 28 73 71 6c 69 74 65 33  File = *(sqlite3
18340 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20  _int64*)pArg;.  
18350 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
18360 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
18370 29 69 64 3b 0a 20 20 20 20 20 20 66 74 72 75 6e  )id;.      ftrun
18380 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 73  cate(pFile->h, s
18390 7a 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zFile);.#endif. 
183a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
183b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
183c0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
183d0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
183e0 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
183f0 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
18400 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
18410 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
18420 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
18430 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
18440 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
18450 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
18460 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
18470 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
18480 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
18490 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
184a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
184b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
184c0 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
184d0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
184e0 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
184f0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
18500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18510 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
18520 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
18530 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
18540 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
18550 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45    case SQLITE_SE
18560 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
18570 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18580 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
18590 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LE: {.      retu
185a0 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  rn proxyFileCont
185b0 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b  rol(id,op,pArg);
185c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
185d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
185e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
185f0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
18600 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  _) */.  }.  retu
18610 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
18620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18630 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
18640 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
18650 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
18660 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
18670 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
18680 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
18690 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
186a0 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
186b0 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
186c0 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
186d0 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
186e0 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
186f0 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
18700 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
18710 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
18720 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
18730 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
18740 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
18750 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
18760 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
18770 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
18780 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
18790 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
187a0 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
187b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
187c0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
187d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
187e0 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
187f0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
18800 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18810 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
18820 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
18830 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
18840 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
18850 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  cs for the file.
18860 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
18870 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73  0 for unix..*/.s
18880 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
18890 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
188a0 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
188b0 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
188c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
188d0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
188e0 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
188f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
18900 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
18910 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
18920 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   an shared memor
18930 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a  y buffer.  .**.*
18940 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  * When multiple 
18950 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65  threads all refe
18960 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77  rence the same w
18970 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74  al-index, each t
18980 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73  hread.** has its
18990 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a   own unixShm obj
189a0 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
189b0 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  l point to a sin
189c0 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20  gle instance.** 
189d0 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  of this unixShmN
189e0 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  ode object.  In 
189f0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
18a00 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f  h wal-index is o
18a10 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e  pened.** only on
18a20 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
18a30 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53  **.** Each unixS
18a40 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
18a50 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20   connected to a 
18a60 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65  single unixInode
18a70 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20  Info object..** 
18a80 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63  We could coalesc
18a90 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e  e this object in
18aa0 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  to unixInodeInfo
18ab0 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64  , but that would
18ac0 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f   mean.** every o
18ad0 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f  pen file that do
18ae0 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65  es not use share
18af0 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68  d memory (in oth
18b00 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a  er words, most.*
18b10 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f  * open files) wo
18b20 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72  uld have to carr
18b30 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78  y around this ex
18b40 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  tra information.
18b50 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78    So.** the unix
18b60 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
18b70 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
18b80 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78  ter to this unix
18b90 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a  ShmNode object.*
18ba0 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68  * and the unixSh
18bb0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
18bc0 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65  created only whe
18bd0 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  n needed..**.** 
18be0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
18bf0 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65  must be true whe
18c00 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65  n creating or de
18c10 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73  stroying.** this
18c20 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65   object or while
18c30 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
18c40 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
18c50 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  g fields:.**.** 
18c60 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20       nRef.**.** 
18c70 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
18c80 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e  elds are read-on
18c90 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
18ca0 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a  ect is created:.
18cb0 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a  ** .**      fid.
18cc0 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  **      zFilenam
18cd0 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75  e.**.** Either u
18ce0 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78  nixShmNode.mutex
18cf0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72   must be held or
18d00 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
18d10 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78  f==0 and.** unix
18d20 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74  MutexHeld() is t
18d30 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67  rue when reading
18d40 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20   or writing any 
18d50 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69  other field.** i
18d60 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
18d70 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
18d80 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78  ShmNode {.  unix
18d90 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
18da0 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e  e;     /* unixIn
18db0 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e  odeInfo that own
18dc0 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20  s this SHM node 
18dd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
18de0 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
18df0 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65  /* Mutex to acce
18e00 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  ss this object *
18e10 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
18e20 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
18e30 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d  * Name of the mm
18e40 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
18e50 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
18e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
18e70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
18e80 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  or */.  int szRe
18e90 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
18ea0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
18eb0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
18ec0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
18ed0 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
18ee0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
18ef0 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
18f00 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69  .  char **apRegi
18f10 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
18f20 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64   Array of mapped
18f30 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
18f40 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
18f50 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
18f60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18f70 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65   of unixShm obje
18f80 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
18f90 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  this */.  unixSh
18fa0 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
18fb0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78       /* All unix
18fc0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
18fd0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
18fe0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
18ff0 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
19000 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
19010 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
19020 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
19030 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
19040 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
19050 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
19060 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
19070 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19090 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
190a0 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
190b0 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
190c0 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
190d0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
190e0 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
190f0 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
19100 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
19110 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
19120 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
19130 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
19140 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
19150 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
19160 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
19170 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
19180 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
19190 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  *.**    unixShm.
191a0 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78  pFile.**    unix
191b0 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
191c0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
191d0 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
191e0 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65  he unixShm.pFile
191f0 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
19200 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
19210 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
19220 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
19230 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
19240 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65   {.  unixShmNode
19250 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
19260 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
19270 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  g unixShmNode ob
19280 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ject */.  unixSh
19290 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
192a0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69       /* Next uni
192b0 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  xShm with the sa
192c0 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  me unixShmNode *
192d0 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
192f0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
19300 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  g the unixShmNod
19310 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36  e mutex */.  u16
19320 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
19330 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
19340 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
19350 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78  held */.  u16 ex
19360 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
19370 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
19380 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
19390 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53  held */.#ifdef S
193a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
193b0 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
193c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
193d0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
193e0 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69  n within its uni
193f0 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64  xShmNode */.#end
19400 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  if.};../*.** Con
19410 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
19420 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
19430 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  ne UNIX_SHM_BASE
19440 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
19450 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
19460 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
19470 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
19480 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20  ne UNIX_SHM_DMS 
19490 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53     (UNIX_SHM_BAS
194a0 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
194b0 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
194c0 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
194d0 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76   Apply posix adv
194e0 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
194f0 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  all bytes from o
19500 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74  fst through ofst
19510 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b  +n-1..**.** Lock
19520 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d  s block if the m
19530 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55  ask is exactly U
19540 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72  NIX_SHM_C and ar
19550 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a  e non-blocking.*
19560 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
19570 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
19580 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
19590 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
195a0 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20  mNode, /* Apply 
195b0 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
195c0 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
195d0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
195e0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
195f0 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
19600 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
19610 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
19620 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
19630 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
19640 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
19650 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
19680 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
19690 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
196a0 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  f;       /* The 
196b0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
196c0 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
196d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
196e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52  QLITE_OK;   /* R
196f0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
19700 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
19710 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
19720 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
19730 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
19740 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
19750 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19760 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53  e3_mutex_held(pS
19770 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c  hmNode->mutex) |
19780 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  | pShmNode->nRef
19790 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61  ==0 );..  /* Sha
197a0 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20  red locks never 
197b0 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  span more than o
197c0 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73  ne byte */.  ass
197d0 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63  ert( n==1 || loc
197e0 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29  kType!=F_RDLCK )
197f0 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72  ;..  /* Locks ar
19800 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a  e within range *
19810 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  /.  assert( n>=1
19820 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d   && n<SQLITE_SHM
19830 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  _NLOCK );..  /* 
19840 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
19850 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
19860 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 66  s */.  memset(&f
19870 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
19880 0a 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f  .  f.l_type = lo
19890 63 6b 54 79 70 65 3b 0a 20 20 66 2e 6c 5f 77 68  ckType;.  f.l_wh
198a0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
198b0 0a 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f  .  f.l_start = o
198c0 66 73 74 3b 0a 20 20 66 2e 6c 5f 6c 65 6e 20 3d  fst;.  f.l_len =
198d0 20 6e 3b 0a 0a 20 20 72 63 20 3d 20 66 63 6e 74   n;..  rc = fcnt
198e0 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46  l(pShmNode->h, F
198f0 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 72  _SETLK, &f);.  r
19900 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
19910 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
19920 49 54 45 5f 42 55 53 59 3b 0a 0a 20 20 2f 2a 20  ITE_BUSY;..  /* 
19930 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
19940 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
19950 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
19960 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
19970 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36  TE_DEBUG.  { u16
19980 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45   mask;.  OSTRACE
19990 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b  (("SHM-LOCK "));
199a0 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f  .  mask = (1<<(o
199b0 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
199c0 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  st);.  if( rc==S
199d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
199e0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
199f0 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
19a00 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
19a10 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
19a20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
19a30 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
19a40 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
19a50 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
19a60 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73   ~mask;.    }els
19a70 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
19a80 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
19a90 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
19aa0 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
19ab0 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
19ac0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
19ad0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
19ae0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
19af0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
19b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
19b10 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
19b20 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
19b30 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
19b40 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
19b50 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
19b60 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d  ode->exclMask |=
19b70 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68   mask;.      pSh
19b80 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
19b90 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
19ba0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
19bb0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
19bc0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
19bd0 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
19be0 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
19bf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
19c00 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
19c10 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
19c20 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
19c30 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d  failed"));.    }
19c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
19c50 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
19c60 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
19c70 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
19c80 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
19c90 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ofst));.    }.  
19ca0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d  }.  OSTRACE((" -
19cb0 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78   afterwards %03x
19cc0 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
19cd0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
19ce0 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e  haredMask, pShmN
19cf0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  ode->exclMask));
19d00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
19d10 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20  eturn rc;       
19d20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67   .}.../*.** Purg
19d30 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  e the unixShmNod
19d40 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c  eList list of al
19d50 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75  l entries with u
19d60 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
19d70 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
19d80 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
19d90 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
19da0 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
19db0 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
19dc0 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
19dd0 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
19de0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
19df0 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75  d unixShmPurge(u
19e00 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
19e10 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20   unixShmNode *p 
19e20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  = pFd->pInode->p
19e30 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
19e40 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
19e50 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  () );.  if( p &&
19e60 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
19e70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
19e80 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d  sert( p->pInode=
19e90 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  =pFd->pInode );.
19ea0 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78      if( p->mutex
19eb0 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   ) sqlite3_mutex
19ec0 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
19ed0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
19ee0 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
19ef0 7b 0a 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70  {.      munmap(p
19f00 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70  ->apRegion[i], p
19f10 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->szRegion);.   
19f20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
19f30 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
19f40 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
19f50 30 20 29 20 63 6c 6f 73 65 28 70 2d 3e 68 29 3b  0 ) close(p->h);
19f60 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e  .    p->pInode->
19f70 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  pShmNode = 0;.  
19f80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
19f90 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
19fa0 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65  Open a shared-me
19fb0 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
19fc0 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64  ated with open d
19fd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
19fe0 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61  Fd.  .** This pa
19ff0 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65  rticular impleme
1a000 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61  ntation uses mma
1a010 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  pped files..**.*
1a020 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20  * The file used 
1a030 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61  to implement sha
1a040 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e  red-memory is in
1a050 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
1a060 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70  ory.** as the op
1a070 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1a080 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
1a090 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70  e name as the op
1a0a0 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  en database.** f
1a0b0 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73  ile with the "-s
1a0c0 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64  hm" suffix added
1a0d0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
1a0e0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1a0f0 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d  file.** is "/hom
1a100 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
1a110 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  b" then the file
1a120 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
1a130 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20   and mmapped.** 
1a140 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
1a150 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  y will be called
1a160 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
1a170 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 57  nfig.db-shm".  W
1a180 65 0a 2a 2a 20 65 78 70 65 72 69 6d 65 6e 74 65  e.** experimente
1a190 64 20 77 69 74 68 20 75 73 69 6e 67 20 66 69 6c  d with using fil
1a1a0 65 73 20 69 6e 20 2f 64 65 76 2f 74 6d 70 20 6f  es in /dev/tmp o
1a1b0 72 20 61 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  r an some other 
1a1c0 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 0a 2a 2a 20  tmpfs mount..** 
1a1d0 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
1a1e0 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
1a1f0 65 63 74 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  ectory from the 
1a200 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1a210 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 64   used,.** then d
1a220 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
1a230 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 72 20 61  permissions or a
1a240 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20   chroot() might 
1a250 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72  cause two differ
1a260 65 6e 74 20 0a 2a 2a 20 70 72 6f 63 65 73 73 65  ent .** processe
1a270 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s on the same da
1a280 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70  tabase to end up
1a290 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74   using different
1a2a0 20 66 69 6c 65 73 20 66 6f 72 20 0a 2a 2a 20 73   files for .** s
1a2b0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 6d  hared memory - m
1a2c0 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69  eaning that thei
1a2d0 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e  r memory would n
1a2e0 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61  ot really be sha
1a2f0 72 65 64 20 2d 20 0a 2a 2a 20 72 65 73 75 6c 74  red - .** result
1a300 69 6e 67 20 69 6e 20 64 61 74 61 62 61 73 65 20  ing in database 
1a310 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
1a320 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
1a330 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
1a340 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
1a350 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
1a360 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
1a370 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
1a380 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
1a390 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
1a3a0 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
1a3b0 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
1a3c0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
1a3d0 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
1a3e0 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
1a3f0 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
1a400 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
1a410 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
1a420 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
1a430 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
1a440 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1a450 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
1a460 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
1a470 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
1a480 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
1a490 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1a4a0 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
1a4b0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1a4e0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
1a4f0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1a500 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
1a510 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
1a520 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
1a530 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1a540 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1a550 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
1a560 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
1a570 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
1a580 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a590 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
1a5a0 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
1a5b0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1a5c0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
1a5d0 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
1a5e0 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
1a5f0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
1a600 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
1a610 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1a620 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
1a630 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
1a640 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (*p));.  assert(
1a650 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
1a660 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
1a670 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53  o see if a unixS
1a680 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c  hmNode object al
1a690 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65  ready exists. Re
1a6a0 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
1a6b0 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73    ** one if pres
1a6c0 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65  ent. Create a ne
1a6d0 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
1a6e0 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ry..  */.  unixE
1a6f0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
1a700 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
1a710 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64  Inode;.  pShmNod
1a720 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  e = pInode->pShm
1a730 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d  Node;.  if( pShm
1a740 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Node==0 ){.    s
1a750 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
1a760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a770 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66    /* fstat() inf
1a780 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  o for database f
1a790 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ile */..    /* C
1a7a0 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
1a7b0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
1a7c0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
1a7d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a7e0 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
1a7f0 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
1a800 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
1a810 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
1a820 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
1a830 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
1a840 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20 54 68   permissions. Th
1a850 65 20 61 63 74 75 61 6c 20 70 65 72 6d 69 73 73  e actual permiss
1a860 69 6f 6e 73 20 74 68 65 20 66 69 6c 65 20 69 73  ions the file is
1a870 20 63 72 65 61 74 65 64 0a 20 20 20 20 2a 2a 20   created.    ** 
1a880 77 69 74 68 20 61 72 65 20 73 75 62 6a 65 63 74  with are subject
1a890 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1a8a0 75 6d 61 73 6b 20 73 65 74 74 69 6e 67 2e 0a 20  umask setting.. 
1a8b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 73     */.    if( fs
1a8c0 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73  tat(pDbFd->h, &s
1a8d0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72  Stat) ){.      r
1a8e0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1a8f0 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f  _FSTAT;.      go
1a900 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1a910 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53 68 6d  .    }..    nShm
1a920 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28  Filename = 5 + (
1a930 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64  int)strlen(pDbFd
1a940 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 53  ->zPath);.    pS
1a950 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  hmNode = sqlite3
1a960 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
1a970 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68  *pShmNode) + nSh
1a980 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20  mFilename );.   
1a990 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
1a9a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1a9b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1a9c0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1a9d0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _err;.    }.    
1a9e0 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c  memset(pShmNode,
1a9f0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d   0, sizeof(*pShm
1aa00 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a 53 68 6d  Node));.    zShm
1aa10 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e  Filename = pShmN
1aa20 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ode->zFilename =
1aa30 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64   (char*)&pShmNod
1aa40 65 5b 31 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  e[1];.    sqlite
1aa50 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
1aa60 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
1aa70 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
1aa80 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1aa90 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
1aaa0 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
1aab0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1aac0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
1aad0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
1aae0 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
1aaf0 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
1ab00 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
1ab10 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1ab20 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1ab30 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1ab40 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1ab50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ab60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1ab70 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1ab80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 68  ;.    }..    pSh
1ab90 6d 4e 6f 64 65 2d 3e 68 20 3d 20 6f 70 65 6e 28  mNode->h = open(
1aba0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f  zShmFilename, O_
1abb0 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 28 73  RDWR|O_CREAT, (s
1abc0 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
1abd0 37 37 37 29 29 3b 0a 20 20 20 20 69 66 28 20 70  777));.    if( p
1abe0 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a  ShmNode->h<0 ){.
1abf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ac00 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
1ac10 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1ac20 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1ac30 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
1ac40 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
1ac50 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
1ac60 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
1ac70 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
1ac80 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
1ac90 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1aca0 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
1acb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1acc0 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  _OK;.    if( uni
1acd0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1ace0 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
1acf0 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
1ad00 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
1ad10 0a 20 20 20 20 20 20 69 66 28 20 66 74 72 75 6e  .      if( ftrun
1ad20 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
1ad30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1ad40 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1ad50 52 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20  R_SHMOPEN;.     
1ad60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1ad70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ad80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
1ad90 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1ada0 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b  ShmNode, F_RDLCK
1adb0 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
1adc0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
1add0 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
1ade0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20  open_err;.  }.. 
1adf0 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
1ae00 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
1ae10 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53  ild of the unixS
1ae20 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
1ae30 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
1ae40 64 65 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  de;.  p->pNext =
1ae50 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1ae60 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
1ae70 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
1ae80 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
1ae90 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
1aea0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1aeb0 74 20 3d 20 70 3b 0a 20 20 70 53 68 6d 4e 6f 64  t = p;.  pShmNod
1aec0 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
1aed0 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
1aee0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1aef0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1af00 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
1af10 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
1af20 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
1af30 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72  rr:.  unixShmPur
1af40 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20  ge(pDbFd);      
1af50 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
1af60 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
1af70 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
1af80 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1af90 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1afa0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1afb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1afc0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1afd0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
1afe0 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
1aff0 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
1b000 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1b010 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1b020 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b030 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
1b040 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
1b050 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
1b060 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
1b070 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
1b080 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
1b090 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
1b0a0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
1b0b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1b0c0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1b0d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1b0e0 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
1b0f0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
1b100 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45  rwise, if the bE
1b110 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20  xtend parameter 
1b120 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
1b130 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1b140 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
1b150 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1b160 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
1b170 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
1b180 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
1b190 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
1b1a0 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
1b1b0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
1b1c0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1b1d0 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45  urned. If .** bE
1b1e0 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  xtend is non-zer
1b1f0 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
1b200 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1b210 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
1b220 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
1b230 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
1b240 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
1b250 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
1b260 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
1b270 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
1b280 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
1b290 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
1b2a0 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
1b2b0 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
1b2c0 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
1b2d0 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
1b2e0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1b2f0 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
1b300 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
1b310 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
1b320 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1b330 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
1b340 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
1b350 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1b360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1b370 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  nixShmMap(.  sql
1b380 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b3a0 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
1b3b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1b3c0 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
1b3f0 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
1b400 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b420 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
1b430 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64  */.  int bExtend
1b440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b450 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1b460 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
1b470 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
1b480 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b4a0 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
1b4b0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ory */.){.  unix
1b4c0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
1b4d0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75  nixFile*)fd;.  u
1b4e0 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69  nixShm *p;.  uni
1b4f0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
1b500 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
1b510 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1b520 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
1b530 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f  mory file has no
1b540 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
1b550 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
1b560 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e  */.  if( pDbFd->
1b570 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pShm==0 ){.    r
1b580 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  c = unixOpenShar
1b590 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b  edMemory(pDbFd);
1b5a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b5b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1b5c0 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70  rc;.  }..  p = p
1b5d0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53  DbFd->pShm;.  pS
1b5e0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1b5f0 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Node;.  sqlite3_
1b600 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1b610 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1b620 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
1b630 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
1b640 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
1b650 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
1b660 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1b670 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
1b680 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
1b690 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b6b0 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72  ew apRegion[] ar
1b6c0 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
1b6d0 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b  Byte = (iRegion+
1b6e0 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a  1)*szRegion;  /*
1b6f0 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
1b700 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1b710 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
1b720 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
1b730 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
1b740 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20   fstat() */..   
1b750 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67   pShmNode->szReg
1b760 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a  ion = szRegion;.
1b770 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
1b780 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20  ested region is 
1b790 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  not mapped into 
1b7a0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1b7b0 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20  ddress space..  
1b7c0 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
1b7d0 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
1b7e0 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
1b7f0 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
1b800 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  x file is.    **
1b810 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
1b820 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
1b830 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
1b840 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
1b850 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  stat(pShmNode->h
1b860 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
1b870 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1b880 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20  OERR_SHMSIZE;.  
1b890 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1b8a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
1b8b0 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69   if( sStat.st_si
1b8c0 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  ze<nByte ){.    
1b8d0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1b8e0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1b8f0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
1b900 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
1b910 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  et to.      ** f
1b920 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
1b930 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
1b940 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
1b950 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1b960 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1b970 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
1b980 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73  y, if bExtend is
1b990 20 74 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e   true, use ftrun
1b9a0 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
1b9b0 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
1b9c0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1b9d0 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
1b9e0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 62 45 78  /.      if( !bEx
1b9f0 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d 70  tend ) goto shmp
1ba00 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 69  age_out;.      i
1ba10 66 28 20 66 74 72 75 6e 63 61 74 65 28 70 53 68  f( ftruncate(pSh
1ba20 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29  mNode->h, nByte)
1ba30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ba40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1ba50 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67  MSIZE;.        g
1ba60 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1ba70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ba80 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
1ba90 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1baa0 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
1bab0 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1bac0 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
1bad0 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   apNew = (char *
1bae0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1baf0 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
1bb00 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28  ode->apRegion, (
1bb10 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
1bb20 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
1bb30 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
1bb40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1bb50 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1bb60 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1bb70 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
1bb80 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
1bb90 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
1bba0 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f      while(pShmNo
1bbb0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1bbc0 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69  gion){.      voi
1bbd0 64 20 2a 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30  d *pMem = mmap(0
1bbe0 2c 20 73 7a 52 65 67 69 6f 6e 2c 20 50 52 4f 54  , szRegion, PROT
1bbf0 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45  _READ|PROT_WRITE
1bc00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4d 41 50  , .          MAP
1bc10 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
1bc20 65 2d 3e 68 2c 20 69 52 65 67 69 6f 6e 2a 73 7a  e->h, iRegion*sz
1bc30 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 29 3b 0a  Region.      );.
1bc40 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
1bc50 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
1bc60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bc70 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
1bc80 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1bc90 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1bca0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
1bcb0 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
1bcc0 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20  egion] = pMem;. 
1bcd0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
1bce0 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
1bcf0 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
1bd00 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
1bd10 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
1bd20 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
1bd30 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
1bd40 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
1bd50 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
1bd60 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1bd70 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1bd80 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1bd90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bda0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
1bdb0 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
1bdc0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1bdd0 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  gment..**.** Not
1bde0 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74  e that the relat
1bdf0 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
1be00 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55  SHAREd and EXCLU
1be10 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20  SIVE locks is a 
1be20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72  little.** differ
1be30 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e  ent here than in
1be40 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d   posix.  In xShm
1be50 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20  Lock(), one can 
1be60 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  go from unlocked
1be70 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e  .** to shared an
1be80 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75  d back or from u
1be90 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75  nlocked to exclu
1bea0 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20  sive and back.  
1beb0 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e  But one may.** n
1bec0 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65  ot go from share
1bed0 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f  d to exclusive o
1bee0 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65  r from exclusive
1bef0 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73   to shared..*/.s
1bf00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1bf10 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
1bf20 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1bf30 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1bf40 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
1bf50 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1bf60 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf80 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
1bf90 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1bfa0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1bfd0 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
1bfe0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
1bff0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
1c000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1c010 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
1c020 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
1c030 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
1c040 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
1c050 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1c060 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
1c070 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75  ed memory */.  u
1c080 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
1c090 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
1c0a0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
1c0b0 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
1c0c0 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
1c0d0 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0f0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1c100 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
1c110 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  gs */.  unixShmN
1c120 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1c130 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a  p->pShmNode;  /*
1c140 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1c150 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20  file iNode */.  
1c160 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c170 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
1c180 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1c190 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
1c1a0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1c0 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
1c1d0 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
1c1e0 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
1c1f0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
1c200 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
1c210 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
1c220 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
1c230 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
1c240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
1c250 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
1c260 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
1c270 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
1c280 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1c290 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1c2a0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1c2b0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1c2c0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1c2d0 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
1c2e0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
1c2f0 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
1c300 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1c310 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
1c320 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1c330 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1c340 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1c350 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1c360 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
1c370 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
1c380 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
1c390 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1c3a0 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
1c3b0 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
1c3c0 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73   (1<<ofst);.  as
1c3d0 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
1c3e0 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
1c3f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1c400 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1c410 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
1c420 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1c430 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
1c440 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
1c450 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
1c460 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
1c470 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
1c480 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
1c490 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
1c4a0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
1c4b0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1c4c0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1c4d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1c4e0 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
1c4f0 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
1c500 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1c510 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
1c520 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
1c530 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
1c540 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
1c550 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
1c560 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
1c570 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
1c580 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
1c590 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
1c5a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
1c5b0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1c5c0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c  (pShmNode, F_UNL
1c5d0 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
1c5e0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1c5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1c600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c610 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
1c620 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
1c630 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1c640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c650 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
1c660 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
1c670 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
1c680 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
1c690 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
1c6a0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1c6b0 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
1c6c0 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
1c6d0 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
1c6e0 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
1c6f0 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
1c700 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
1c710 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
1c720 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
1c730 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
1c740 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1c750 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
1c760 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
1c770 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
1c780 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
1c790 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
1c7a0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
1c7b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1c7c0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1c7d0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1c7e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1c7f0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
1c800 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
1c810 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c820 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1c830 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c840 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
1c850 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
1c860 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c870 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
1c880 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
1c890 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
1c8a0 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
1c8b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c8c0 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
1c8d0 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
1c8e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c8f0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1c900 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44  k(pShmNode, F_RD
1c910 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
1c920 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1c930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c940 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c960 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
1c970 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
1c980 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
1c990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c9a0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
1c9b0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1c9c0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
1c9d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
1c9e0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1c9f0 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
1ca00 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
1ca10 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
1ca20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
1ca30 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
1ca40 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
1ca50 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1ca60 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1ca70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1ca80 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1ca90 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1caa0 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
1cab0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
1cac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1cad0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1cae0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1caf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1cb00 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
1cb10 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
1cb20 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
1cb30 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
1cb40 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
1cb50 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
1cb60 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
1cb70 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
1cb80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
1cb90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cba0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
1cbb0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1cbc0 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f  Node, F_WRLCK, o
1cbd0 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
1cbe0 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
1cbf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cc00 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1cc10 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
1cc20 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
1cc30 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
1cc40 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1cc50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1cc60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1cc70 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
1cc80 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
1cc90 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
1cca0 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
1ccb0 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
1ccc0 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
1ccd0 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61  getpid(), p->sha
1cce0 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
1ccf0 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e  Mask));.  return
1cd00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
1cd10 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
1cd20 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
1cd30 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
1cd40 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
1cd50 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
1cd60 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
1cd70 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
1cd80 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
1cd90 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
1cda0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
1cdb0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
1cdc0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1cdd0 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  id unixShmBarrie
1cde0 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
1cdf0 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20  e *fd           
1ce00 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1ce10 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
1ce20 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1ce30 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
1ce40 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1ce50 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1ce60 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
1ce70 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ex();.}../*.** C
1ce80 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
1ce90 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
1cea0 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
1ceb0 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
1cec0 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
1ced0 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
1cee0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
1cef0 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  no shared memory
1cf00 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1cf10 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1cf20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
1cf30 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
1cf40 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ss no-op..*/.sta
1cf50 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
1cf60 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
1cf70 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1cf80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1cf90 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
1cfa0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1cfb0 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cfd0 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65  Delete shared-me
1cfe0 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a  mory if true */.
1cff0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d010 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1d020 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
1d030 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  sed */.  unixShm
1d040 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
1d050 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d060 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
1d070 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
1d080 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b  .  unixShm **pp;
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1d0b0 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
1d0c0 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
1d0d0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0f0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1d100 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1d110 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
1d120 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
1d130 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1d140 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1d150 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d160 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
1d170 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  ShmNode;..  asse
1d180 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
1d190 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
1d1a0 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
1d1b0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
1d1c0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
1d1d0 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  de );..  /* Remo
1d1e0 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
1d1f0 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
1d200 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
1d210 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
1d220 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
1d230 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1d240 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1d250 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
1d260 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1d270 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
1d280 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
1d290 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
1d2a0 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
1d2b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
1d2c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1d2d0 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
1d2e0 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
1d2f0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1d300 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1d310 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
1d320 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
1d330 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
1d340 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1d350 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
1d360 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
1d370 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1d380 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
1d390 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
1d3a0 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
1d3b0 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
1d3c0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
1d3d0 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65  {.    if( delete
1d3e0 46 6c 61 67 20 29 20 75 6e 6c 69 6e 6b 28 70 53  Flag ) unlink(pS
1d3f0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1d400 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50  e);.    unixShmP
1d410 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d  urge(pDbFd);.  }
1d420 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
1d430 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
1d440 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65  QLITE_OK;.}...#e
1d450 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
1d460 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  xShmMap     0.# 
1d470 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f  define unixShmLo
1d480 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
1d490 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20   unixShmBarrier 
1d4a0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
1d4b0 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
1d4c0 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
1d4d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
1d4e0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
1d4f0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
1d500 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
1d510 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
1d520 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
1d530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
1d540 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
1d550 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1d560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d570 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1d580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d5c0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
1d5d0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
1d5e0 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
1d5f0 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
1d600 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
1d610 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
1d620 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
1d630 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
1d640 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
1d650 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
1d660 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
1d670 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
1d680 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
1d690 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
1d6a0 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
1d6b0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1d6c0 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
1d6d0 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1d6e0 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
1d6f0 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
1d700 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
1d710 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
1d720 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
1d730 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
1d740 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
1d750 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
1d760 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
1d770 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
1d780 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
1d790 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1d7a0 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
1d7b0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
1d7c0 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
1d7d0 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
1d7e0 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
1d7f0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
1d800 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
1d810 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
1d820 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
1d830 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
1d840 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
1d850 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
1d860 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
1d870 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f  r-funtion F, two
1d880 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
1d890 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
1d8a0 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
1d8b0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
1d8c0 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
1d8d0 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
1d8e0 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
1d8f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
1d900 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
1d910 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
1d920 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
1d930 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
1d940 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
1d950 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
1d960 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
1d970 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
1d980 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
1d990 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
1d9a0 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
1d9b0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
1d9c0 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
1d9d0 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
1d9e0 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
1d9f0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
1da00 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
1da10 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
1da20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
1da30 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
1da40 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
1da50 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
1da60 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1da70 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
1da80 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
1da90 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
1daa0 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
1dab0 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
1dac0 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
1dad0 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
1dae0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
1daf0 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
1db00 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
1db10 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
1db20 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
1db30 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
1db40 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
1db50 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
1db60 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20  ETHOD, VERSION, 
1db70 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
1db80 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20  OCK, CKLOCK)    
1db90 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
1dba0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1dbb0 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20  ods METHOD = {  
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbe0 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20   \.   VERSION,  
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20  \.   CLOSE,     
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1dc80 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20  .   unixRead,   
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20  /* xRead */     
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1dcd0 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dcf0 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1dd20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20    unixTruncate, 
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd40 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20   xTruncate */   
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1dd70 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd90 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1ddc0 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20  unixFileSize,   
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1dde0 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20  FileSize */     
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de00 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c            \.   L
1de10 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
1de20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1de30 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de50 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e           \.   UN
1de60 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
1de70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1de80 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  lock */         
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dea0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c          \.   CKL
1deb0 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
1dec0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
1ded0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
1dee0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1def0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1df00 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
1df10 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1df20 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20  Control */      
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1df50 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
1df60 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
1df70 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65       \.   unixDe
1dfa0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1dfb0 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
1dfc0 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20  Capabilities */ 
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
1dff0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
1e000 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
1e010 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e030 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c     \.   unixShmL
1e040 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1e050 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
1e060 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61    \.   unixShmBa
1e090 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
1e0a0 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
1e0b0 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0d0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d   \.   unixShmUnm
1e0e0 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ap              
1e0f0 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
1e100 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1e170 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1e180 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1e190 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
1e1a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
1e1b0 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
1e1c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1e1d0 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
1e1e0 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e210 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
1e2b0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1e2c0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
1e2d0 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
1e2e0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
1e2f0 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
1e300 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
1e310 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
1e320 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
1e330 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1e340 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
1e350 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
1e360 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
1e370 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
1e380 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
1e390 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
1e3a0 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
1e3b0 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
1e3c0 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
1e3d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1e3e0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1e3f0 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
1e400 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1e410 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1e420 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1e430 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20   name */.  2,   
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e450 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
1e460 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64  emory is enabled
1e470 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
1e4a0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4c0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
1e4d0 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e4f0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
1e500 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
1e510 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
1e520 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1e530 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
1e540 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  ).IOMETHODS(.  n
1e550 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  olockIoFinder,  
1e560 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
1e570 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
1e580 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65   */.  nolockIoMe
1e590 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
1e5a0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
1e5b0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
1e5c0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
1e5f0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
1e600 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e620 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
1e630 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e650 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1e660 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
1e670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e680 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
1e690 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
1e6a0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20  servedLock   /* 
1e6b0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1e6c0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
1e6d0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
1e6e0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
1e6f0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1e700 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1e710 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
1e720 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
1e730 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1e740 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1e750 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e770 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
1e780 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
1e790 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
1e7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1e7b0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
1e7c0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
1e7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1e7e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
1e7f0 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
1e800 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1e810 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1e820 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
1e830 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68  rvedLock  /* xCh
1e840 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1e850 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66  method */.)..#if
1e860 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1e870 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1e880 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45  !OS_VXWORKS.IOME
1e890 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
1e8a0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1e8b0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
1e8c0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1e8d0 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
1e8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1e8f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1e900 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1e910 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
1e920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
1e930 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
1e940 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
1e950 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
1e960 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1e970 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
1e980 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
1e990 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1e9a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
1e9b0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
1e9c0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1e9d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
1e9e0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
1e9f0 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
1ea00 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
1ea10 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
1ea20 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1ea30 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
1ea40 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
1ea50 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
1ea60 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1ea70 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
1ea80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1ea90 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1eaa0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
1eab0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ead0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
1eae0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
1eaf0 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20   semClose,      
1eb00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1eb10 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
1eb20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20   semLock,       
1eb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1eb40 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1eb50 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  semUnlock,      
1eb60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1eb70 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
1eb80 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
1eb90 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
1eba0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1ebb0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
1ebc0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
1ebd0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1ebe0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1ebf0 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
1ec00 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e  HODS(.  afpIoFin
1ec10 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
1ec20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
1ec30 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  tion name */.  a
1ec40 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fpIoMethods,    
1ec50 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
1ec60 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1ec70 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
1ec80 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1ec90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
1eca0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
1ecb0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43  sabled */.  afpC
1ecc0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1ecd0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1ece0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c  method */.  afpL
1ecf0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1ed00 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1ed10 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e  ethod */.  afpUn
1ed20 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1ed30 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1ed40 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43  method */.  afpC
1ed50 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1ed60 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
1ed70 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1ed80 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
1ed90 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
1eda0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
1edb0 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
1edc0 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
1edd0 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
1ede0 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
1edf0 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
1ee00 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
1ee10 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
1ee20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
1ee30 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
1ee40 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
1ee50 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
1ee60 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
1ee70 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
1ee80 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
1ee90 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
1eea0 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
1eeb0 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
1eec0 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
1eed0 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
1eee0 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
1eef0 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
1ef00 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
1ef10 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
1ef20 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
1ef30 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
1ef40 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
1ef50 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
1ef60 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
1ef70 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
1ef80 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1ef90 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1efa0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
1efb0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
1efc0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
1efd0 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
1efe0 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
1eff0 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
1f000 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
1f010 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
1f020 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
1f030 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
1f040 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
1f050 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
1f060 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
1f070 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
1f080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
1f090 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
1f0a0 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
1f0b0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
1f0c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
1f0d0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
1f0e0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
1f110 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
1f120 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f140 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
1f150 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f170 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
1f180 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f1a0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1f1b0 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
1f1c0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
1f1d0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1f1e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
1f1f0 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c  #endif../* nfs l
1f200 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33  ockd on OSX 10.3
1f210 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20  + doesn't clear 
1f220 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e  write locks when
1f230 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
1f240 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  set */.#if defin
1f250 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1f260 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1f270 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
1f280 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46  ETHODS(.  nfsIoF
1f290 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
1f2a0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1f2b0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1f2c0 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20    nfsIoMethods, 
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f2e0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1f2f0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1f300 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f320 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
1f330 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
1f340 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
1f350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f360 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1f370 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f390 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1f3a0 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20    nfsUnlock,    
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f3c0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1f3d0 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
1f3e0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
1f3f0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1f400 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
1f410 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1f420 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1f430 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1f440 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
1f450 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
1f460 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
1f470 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
1f480 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
1f490 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
1f4a0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1f4b0 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
1f4c0 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
1f4d0 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
1f4e0 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
1f4f0 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
1f500 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
1f510 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
1f520 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c  s for MacOSX onl
1f530 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
1f540 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1f550 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
1f560 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
1f570 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
1f580 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
1f590 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f5a0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
1f5b0 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
1f5c0 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20     /* open file 
1f5d0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64  object for the d
1f5e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1f5f0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
1f600 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67  t struct Mapping
1f610 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
1f620 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  r *zFilesystem; 
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f640 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  Filesystem type 
1f650 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  name */.    cons
1f660 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1f670 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20  hods *pMethods; 
1f680 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65    /* Appropriate
1f690 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
1f6a0 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20  */.  } aMap[] = 
1f6b0 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20  {.    { "hfs",  
1f6c0 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
1f6d0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22  s },.    { "ufs"
1f6e0 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
1f6f0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61  hods },.    { "a
1f700 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  fpfs",  &afpIoMe
1f710 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
1f720 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  smbfs",  &afpIoM
1f730 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
1f740 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63  "webdav", &noloc
1f750 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  kIoMethods },.  
1f760 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a    { 0, 0 }.  };.
1f770 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1f780 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
1f790 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
1f7a0 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
1f7b0 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
1f7c0 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
1f7d0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
1f7e0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
1f7f0 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
1f800 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
1f810 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
1f820 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
1f830 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
1f840 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
1f850 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28   }.  if( statfs(
1f860 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66  filePath, &fsInf
1f870 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) != -1 ){.    
1f880 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if( fsInfo.f_fla
1f890 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20  gs & MNT_RDONLY 
1f8a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f8b0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
1f8c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1f8d0 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  i=0; aMap[i].zFi
1f8e0 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a  lesystem; i++){.
1f8f0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
1f900 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
1f910 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46  name, aMap[i].zF
1f920 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b  ilesystem)==0 ){
1f930 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f940 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73  aMap[i].pMethods
1f950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f960 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c    }..  /* Defaul
1f970 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c  t case. Handles,
1f980 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c   amongst others,
1f990 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73   "nfs"..  ** Tes
1f9a0 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  t byte-range loc
1f9b0 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e  k using fcntl().
1f9c0 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63   If the call suc
1f9d0 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73  ceeds, .  ** ass
1f9e0 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
1f9f0 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
1fa00 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  s POSIX style lo
1fa10 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63  cks. .  */.  loc
1fa20 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
1fa30 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
1fa40 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
1fa50 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
1fa60 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
1fa70 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
1fa80 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74  DLCK;.  if( fcnt
1fa90 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
1faa0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
1fab0 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
1fac0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
1fad0 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
1fae0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1faf0 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
1fb00 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
1fb10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
1fb20 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
1fb30 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1fb40 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
1fb50 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
1fb60 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
1fb70 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1fb80 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
1fb90 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
1fba0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
1fbb0 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
1fbc0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
1fbd0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1fbe0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1fbf0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1fc00 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
1fc10 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  #if OS_VXWORKS &
1fc20 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1fc30 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
1fc40 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
1fc50 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
1fc60 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
1fc70 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
1fc80 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
1fc90 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
1fca0 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
1fcb0 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
1fcc0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
1fcd0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
1fce0 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
1fcf0 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
1fd00 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
1fd10 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c   for VXWorks onl
1fd20 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
1fd30 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1fd40 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
1fd50 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
1fd60 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
1fd70 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
1fd80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1fd90 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
1fda0 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
1fdb0 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
1fdc0 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
1fdd0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
1fde0 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
1fdf0 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
1fe00 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
1fe10 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
1fe20 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
1fe30 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
1fe40 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
1fe50 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
1fe60 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
1fe70 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
1fe80 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
1fe90 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
1fea0 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
1feb0 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
1fec0 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
1fed0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
1fee0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
1fef0 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
1ff00 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
1ff10 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
1ff20 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
1ff30 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
1ff40 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
1ff50 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
1ff60 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
1ff70 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66  F_RDLCK;.  if( f
1ff80 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
1ff90 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
1ffa0 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
1ffb0 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
1ffc0 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
1ffd0 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
1ffe0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
1fff0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
20000 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
20010 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
20020 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
20030 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
20040 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
20050 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
20060 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
20070 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  S && SQLITE_ENAB
20080 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
20090 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62   */../*.** An ab
200a0 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20  stract type for 
200b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49  a pointer to a I
200c0 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
200d0 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
200e0 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
200f0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
20100 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
20110 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
20120 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
20130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20170 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
20180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20190 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
201a0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
201b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
201c0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
201d0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
201e0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
201f0 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
20200 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
20210 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
20220 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
20230 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
20240 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
20250 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
20260 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
20270 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
20280 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
20290 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
202a0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
202b0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
202c0 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
202d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
202e0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
202f0 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
20300 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
20310 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20 20  dirfd,          
20320 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
20330 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
20340 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
20350 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
20360 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
20370 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
20380 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
20390 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
203a0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
203b0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
203c0 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  ned */.  int noL
203d0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
203e0 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67   /* Omit locking
203f0 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
20400 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 20  t isDelete      
20410 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
20420 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65  on close if true
20430 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
20440 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
20450 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
20460 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
20470 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
20480 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
20490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
204a0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
204b0 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
204c0 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73 44  /* Parameter isD
204d0 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73  elete is only us
204e0 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45  ed on vxworks. E
204f0 78 70 72 65 73 73 20 74 68 69 73 20 65 78 70 6c  xpress this expl
20500 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72  icitly .  ** her
20510 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d  e to prevent com
20520 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
20530 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61  bout unused para
20540 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55  meters..  */.  U
20550 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
20560 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20 4f 53  isDelete);..  OS
20570 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
20580 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
20590 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
205a0 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
205b0 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64  w->dirfd = dirfd
205c0 3b 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46 6c  ;.  pNew->fileFl
205d0 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ags = 0;.  asser
205e0 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
205f0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
20600 3d 27 2f 27 20 29 3b 20 20 2f 2a 20 4e 65 76 65  ='/' );  /* Neve
20610 72 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  r a relative pat
20620 68 6e 61 6d 65 20 2a 2f 0a 20 20 70 4e 65 77 2d  hname */.  pNew-
20630 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
20640 6d 65 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  me;..#if OS_VXWO
20650 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
20660 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
20670 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
20680 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
20690 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b  =0 ){.    noLock
206a0 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
206b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
206c0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
206d0 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  oLock ){.    pLo
206e0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
206f0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
20700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
20710 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
20720 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
20730 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
20740 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
20750 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
20760 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
20770 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
20780 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
20790 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
207a0 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
207b0 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
207c0 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
207d0 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
207e0 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
207f0 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
20800 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
20810 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
20820 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
20830 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
20840 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
20850 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
20860 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
20870 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
20880 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
20890 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
208a0 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
208b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
208c0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
208d0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
208e0 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
208f0 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
20900 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
20910 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
20920 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
20930 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
20940 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
20950 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
20960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20970 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
20980 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69  or occured in fi
20990 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63  ndInodeInfo(), c
209a0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
209b0 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a  scriptor.      *
209c0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62  * immediately, b
209d0 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20  efore releasing 
209e0 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49  the mutex. findI
209f0 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66  nodeInfo() may f
20a00 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ail.      ** in 
20a10 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20  two scenarios:. 
20a20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20a30 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f     (a) A call to
20a40 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e   fstat() failed.
20a50 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20  .      **   (b) 
20a60 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e  A malloc failed.
20a70 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
20a80 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20  ** Scenario (b) 
20a90 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  may only occur i
20aa0 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73  f the process is
20ab0 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65   holding no othe
20ac0 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
20ad0 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
20ae0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
20af0 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65  e. If there were
20b00 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20   other file.    
20b10 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73    ** descriptors
20b20 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74   on this file, t
20b30 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f  hen no malloc wo
20b40 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20  uld be required 
20b50 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64  by.      ** find
20b60 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20  InodeInfo(). If 
20b70 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
20b80 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61  , it is quite sa
20b90 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20  fe to close.    
20ba0 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20    ** handle h - 
20bb0 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  as it is guarant
20bc0 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69  eed that no posi
20bd0 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20  x locks will be 
20be0 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a  released.      *
20bf0 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20  * by doing so.. 
20c00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20c10 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29   If scenario (a)
20c20 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f   caused the erro
20c30 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72  r then things ar
20c40 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54  e not so safe. T
20c50 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
20c60 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20  icit assumption 
20c70 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20  here is that if 
20c80 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74  fstat() fails, t
20c90 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20  hings are in.   
20ca0 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73     ** such bad s
20cb0 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69  hape that droppi
20cc0 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f  ng a lock or two
20cd0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
20ce0 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  much..      */. 
20cf0 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20       close(h);. 
20d00 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
20d10 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
20d20 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
20d30 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20d40 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
20d50 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
20d60 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
20d70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
20d80 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
20d90 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
20da0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
20db0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
20dc0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
20dd0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
20de0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
20df0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
20e00 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
20e10 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
20e20 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
20e30 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
20e40 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
20e50 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66  *pCtx) );.    if
20e60 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
20e70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
20e80 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
20e90 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46  .      /* NB: zF
20ea0 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
20eb0 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
20ec0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
20ed0 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
20ee0 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
20ef0 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31  requirement F111
20f00 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  41.  So we do no
20f10 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
20f20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
20f30 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20  f the filename. 
20f40 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64  */.      pCtx->d
20f50 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  bPath = zFilenam
20f60 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72  e;.      pCtx->r
20f70 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20  eserved = 0;.   
20f80 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
20f90 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72  .      unixEnter
20fa0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72  Mutex();.      r
20fb0 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
20fc0 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
20fd0 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66  Inode);.      if
20fe0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20ff0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21000 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f  e3_free(pNew->lo
21010 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
21020 20 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b         close(h);
21030 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  .        h = -1;
21040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
21050 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
21060 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20          .    }. 
21070 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73   }.#endif..  els
21080 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
21090 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  yle == &dotlockI
210a0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
210b0 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  /* Dotfile locki
210c0 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
210d0 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
210e0 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
210f0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   in.    ** the d
21100 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
21110 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20  text .    */.   
21120 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
21130 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e  ;.    int nFilen
21140 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  ame;.    nFilena
21150 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
21160 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
21170 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
21180 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
21190 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
211a0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
211b0 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
211c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
211d0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
211e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
211f0 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
21200 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
21210 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
21220 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
21230 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
21240 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
21250 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
21260 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
21270 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
21280 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
21290 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
212a0 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
212b0 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
212c0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
212d0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
212e0 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
212f0 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
21300 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
21310 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
21320 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
21330 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
21340 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
21350 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
21360 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
21370 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
21380 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
21390 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
213a0 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
213b0 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
213c0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
213d0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
213e0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
213f0 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
21400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21410 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
21420 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
21430 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
21440 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
21450 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
21460 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
21470 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
21480 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
21490 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
214a0 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
214b0 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
214c0 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
214d0 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
214e0 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
214f0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
21500 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
21510 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
21520 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
21530 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
21540 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
21550 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
21560 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
21570 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f   pNew->lastErrno
21580 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57   = 0;.#if OS_VXW
21590 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
215a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
215b0 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65  if( h>=0 ) close
215c0 28 68 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b  (h);.    h = -1;
215d0 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  .    unlink(zFil
215e0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65  ename);.    isDe
215f0 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lete = 0;.  }.  
21600 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d  pNew->isDelete =
21610 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69   isDelete;.#endi
21620 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
21630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
21640 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73   dirfd>=0 ) clos
21650 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c  e(dirfd); /* sil
21660 65 6e 74 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  ent leak if fail
21670 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72  , already in err
21680 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 3e  or */.    if( h>
21690 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a 20  =0 ) close(h);. 
216a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
216b0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63  ->pMethod = pLoc
216c0 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f  kingStyle;.    O
216d0 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
216e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
216f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
21700 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
21710 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
21720 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
21730 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
21740 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
21750 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
21760 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
21770 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
21780 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21790 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
217a0 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
217b0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
217c0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
217d0 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
217e0 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
217f0 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
21800 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
21810 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
21820 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
21830 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
21840 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
21850 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
21860 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
21870 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
21880 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
21890 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
218a0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
218b0 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
218c0 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
218d0 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
218e0 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
218f0 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
21900 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
21910 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
21920 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
21930 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
21940 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
21950 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61  ; ii>1 && zDirna
21960 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
21970 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
21980 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
21990 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
219a0 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
219b0 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
219c0 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
219d0 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65  ( fd>=0 ){.#ifde
219e0 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20  f FD_CLOEXEC.   
219f0 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53     fcntl(fd, F_S
21a00 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20  ETFD, fcntl(fd, 
21a10 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
21a20 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
21a30 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  f.      OSTRACE(
21a40 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
21a50 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
21a60 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  me));.    }.  }.
21a70 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72    *pFd = fd;.  r
21a80 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c  eturn (fd>=0?SQL
21a90 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41  ITE_OK:SQLITE_CA
21aa0 4e 54 4f 50 45 4e 5f 42 4b 50 54 29 3b 0a 7d 0a  NTOPEN_BKPT);.}.
21ab0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21ac0 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  e name of a dire
21ad0 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74  ctory in which t
21ae0 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20  o put temporary 
21af0 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20  files..** If no 
21b00 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61  suitable tempora
21b10 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72  ry file director
21b20 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  y can be found, 
21b30 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
21b40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
21b50 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44  r *unixTempFileD
21b60 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ir(void){.  stat
21b70 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
21b80 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
21b90 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20   0,.     0,.    
21ba0 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
21bb0 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
21bc0 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
21bd0 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
21be0 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
21bf0 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
21c00 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
21c10 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74  tat buf;.  const
21c20 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
21c30 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ..  azDirs[0] = 
21c40 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
21c50 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61  ectory;.  if( !a
21c60 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
21c70 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[1] = getenv("T
21c80 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69  MPDIR");.  for(i
21c90 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
21ca0 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
21cb0 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44  rs[0]); zDir=azD
21cc0 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69  irs[i++]){.    i
21cd0 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e  f( zDir==0 ) con
21ce0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
21cf0 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
21d00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21d10 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
21d20 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
21d30 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63  inue;.    if( ac
21d40 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29  cess(zDir, 07) )
21d50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62   continue;.    b
21d60 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
21d70 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zDir;.}../*.*
21d80 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
21d90 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
21da0 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
21db0 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
21dc0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
21dd0 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75  g process and mu
21de0 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
21df0 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73   to hold at leas
21e00 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74  t.** pVfs->mxPat
21e10 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a  hname bytes..*/.
21e20 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
21e30 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
21e40 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
21e50 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
21e60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
21e70 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
21e80 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
21e90 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
21ea0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
21eb0 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
21ec0 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
21ed0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
21ee0 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  j;.  const char 
21ef0 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27  *zDir;..  /* It'
21f00 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
21f10 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
21f20 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
21f30 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
21f40 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
21f50 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
21f60 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
21f70 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
21f80 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
21f90 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
21fa0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
21fb0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
21fc0 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44  E_IOERR );..  zD
21fd0 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c  ir = unixTempFil
21fe0 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44  eDir();.  if( zD
21ff0 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22  ir==0 ) zDir = "
22000 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  .";..  /* Check 
22010 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
22020 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
22030 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
22040 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
22050 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20   ** name. If it 
22060 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  is not, return S
22070 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a  QLITE_ERROR..  *
22080 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28  /.  if( (strlen(
22090 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53  zDir) + strlen(S
220a0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
220b0 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d  PREFIX) + 17) >=
220c0 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b   (size_t)nBuf ){
220d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
220e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
220f0 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
22100 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
22110 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  7, zBuf, "%s/"SQ
22120 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
22130 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
22140 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    j = (int)strle
22150 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  n(zBuf);.    sql
22160 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
22170 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
22180 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
22190 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
221a0 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
221b0 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
221c0 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
221d0 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
221e0 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
221f0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
22200 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
22210 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
22220 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22230 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
22240 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
22250 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
22260 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
22270 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
22280 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
22290 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
222a0 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
222b0 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
222c0 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
222d0 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
222e0 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
222f0 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
22300 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
22310 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
22320 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
22330 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
22340 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
22350 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
22360 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
22370 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   Search for an u
22380 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
22390 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f  iptor that was o
223a0 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  pened on the dat
223b0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28  abase .** file (
223c0 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72  not a journal or
223d0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
223e0 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64  file) identified
223f0 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20   by pathname.** 
22400 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54  zPath with SQLIT
22410 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
22420 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20   matching those 
22430 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
22440 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
22450 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
22460 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20  n..**.** Such a 
22470 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
22480 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64  may exist if a d
22490 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
224a0 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a  on was closed.**
224b0 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61   but the associa
224c0 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ted file descrip
224d0 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tor could not be
224e0 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20   closed because 
224f0 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69  some.** other fi
22500 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
22510 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
22520 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ile is holding a
22530 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52   file-lock..** R
22540 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73  efer to comments
22550 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73   in the unixClos
22560 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  e() function and
22570 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d   the lengthy com
22580 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69  ment.** describi
22590 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f  ng "Posix Adviso
225a0 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74  ry Locking" at t
225b0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
225c0 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75   file for .** fu
225d0 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41  rther details. A
225e0 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31  lso, ticket #401
225f0 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75  8..**.** If a su
22600 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  itable file desc
22610 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c  riptor is found,
22620 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
22630 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73  rned. If no.** s
22640 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
22650 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  tor is located, 
22660 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
22670 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e  */.static UnixUn
22680 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73  usedFd *findReus
22690 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61  ableFd(const cha
226a0 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
226b0 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73  ags){.  UnixUnus
226c0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
226d0 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  0;..  /* Do not 
226e0 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  search for an un
226f0 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
22700 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  ptor on vxworks.
22710 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a   Not because.  *
22720 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20  * vxworks would 
22730 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  not benefit from
22740 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20   the change (it 
22750 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74  might, we're not
22760 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74   sure),.  ** but
22770 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20   because no way 
22780 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75  to test it is cu
22790 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
227a0 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20  e. It is better 
227b0 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73  .  ** not to ris
227c0 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72  k breaking vxwor
227d0 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  ks support for t
227e0 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20  he sake of such 
227f0 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a  an obscure .  **
22800 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69   feature.  */.#i
22810 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
22820 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
22830 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
22840 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
22850 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a  of stat() call *
22860 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  /..  /* A stat()
22870 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
22880 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
22890 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
228a0 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
228b0 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
228c0 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
228d0 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
228e0 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
228f0 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
22900 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
22910 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
22920 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
22930 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
22940 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
22950 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
22960 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
22970 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
22980 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
22990 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
229a0 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
229b0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
229c0 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
229d0 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
229e0 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
229f0 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
22a00 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
22a10 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
22a20 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
22a30 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20   resusable file 
22a40 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e  descriptor are n
22a50 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69  ot dire.  */.  i
22a60 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68  f( 0==stat(zPath
22a70 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
22a80 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
22a90 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69  pInode;..    uni
22aa0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
22ab0 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64     pInode = inod
22ac0 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  eList;.    while
22ad0 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e  ( pInode && (pIn
22ae0 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  ode->fileId.dev!
22af0 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b10 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69     || pInode->fi
22b20 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e  leId.ino!=sStat.
22b30 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20  st_ino) ){.     
22b40 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
22b50 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  e->pNext;.    }.
22b60 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29      if( pInode )
22b70 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
22b80 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
22b90 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d   for(pp=&pInode-
22ba0 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26  >pUnused; *pp &&
22bb0 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66   (*pp)->flags!=f
22bc0 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29  lags; pp=&((*pp)
22bd0 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  ->pNext));.     
22be0 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a   pUnused = *pp;.
22bf0 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65        if( pUnuse
22c00 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  d ){.        *pp
22c10 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78   = pUnused->pNex
22c20 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
22c30 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
22c40 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
22c50 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56  f    /* if !OS_V
22c60 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75  XWORKS */.  retu
22c70 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f  rn pUnused;.}../
22c80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22c90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
22ca0 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65  unixOpen() to de
22cb0 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
22cc0 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
22cd0 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69  to create new fi
22ce0 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20  les with. If no 
22cf0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
22d00 65 6e 20 53 51 4c 69 74 65 20 69 73 20 72 65 74  en SQLite is ret
22d10 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76  urned.** and a v
22d20 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f  alue suitable fo
22d30 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65  r passing as the
22d40 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
22d50 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a  to open(2) is.**
22d60 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f   written to *pMo
22d70 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  de. If an IO err
22d80 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
22d90 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
22da0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
22db0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
22dc0 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d   *pMode is not m
22dd0 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  odified..**.** I
22de0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
22df0 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74 65 6d   opened is a tem
22e00 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69 74 20  porary file, it 
22e10 69 73 20 61 6c 77 61 79 73 20 63 72 65 61 74 65  is always create
22e20 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6f 63  d with.** the oc
22e30 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  tal permissions 
22e40 30 36 30 30 20 28 72 65 61 64 2f 77 72 69 74 61  0600 (read/writa
22e50 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f 6e 6c  ble by owner onl
22e60 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a  y). If the file.
22e70 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61 73 65  ** is a database
22e80 2c 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73  , journal or mas
22e90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
22ea0 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
22eb0 77 69 74 68 20 74 68 65 0a 2a 2a 20 70 65 72 6d  with the.** perm
22ec0 69 73 73 69 6f 6e 73 20 6d 61 73 6b 20 53 51 4c  issions mask SQL
22ed0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
22ee0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a  _PERMISSIONS..**
22ef0 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
22f00 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
22f10 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 66  pened is a WAL f
22f20 69 6c 65 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ile, then this f
22f30 75 6e 63 74 69 6f 6e 0a 2a 2a 20 71 75 65 72 69  unction.** queri
22f40 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  es the file-syst
22f50 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69  em for the permi
22f60 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f  ssions on the co
22f70 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
22f80 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 61 6e 64  base.** file and
22f90 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20   sets *pMode to 
22fa0 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
22fb0 65 76 65 72 20 70 6f 73 73 69 62 6c 65 2c 20 57  ever possible, W
22fc0 41 4c 20 66 69 6c 65 73 20 61 72 65 20 0a 2a 2a  AL files are .**
22fd0 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
22fe0 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
22ff0 6f 6e 73 20 61 73 20 74 68 65 20 61 73 73 6f 63  ons as the assoc
23000 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
23010 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
23020 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c  nt findCreateFil
23030 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eMode(.  const c
23040 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
23050 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
23060 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62   of file (possib
23070 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65  ly) being create
23080 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  d */.  int flags
23090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
230a0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
230b0 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72  passed as 4th ar
230c0 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28  gument to xOpen(
230d0 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70  ) */.  mode_t *p
230e0 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
230f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
23100 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70  ermissions to op
23110 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  en file with */.
23120 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
23130 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
23140 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
23150 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 66 6c 61  ode */.  if( fla
23160 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23170 5f 57 41 4c 20 29 7b 0a 20 20 20 20 63 68 61 72  _WAL ){.    char
23180 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d   zDb[MAX_PATHNAM
23190 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74  E+1];     /* Dat
231a0 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20  abase file path 
231b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20  */.    int nDb; 
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
231e0 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e  f valid bytes in
231f0 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75   zDb */.    stru
23200 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
23210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
23220 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
23230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
23240 2f 0a 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c  /..    nDb = sql
23250 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
23260 74 68 29 20 2d 20 34 3b 0a 20 20 20 20 6d 65 6d  th) - 4;.    mem
23270 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20  cpy(zDb, zPath, 
23280 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44  nDb);.    zDb[nD
23290 62 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 69  b] = '\0';.    i
232a0 66 28 20 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20  f( 0==stat(zDb, 
232b0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
232c0 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e   *pMode = sStat.
232d0 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a  st_mode & 0777;.
232e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
232f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
23300 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
23310 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
23320 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
23330 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b  DELETEONCLOSE ){
23340 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36  .    *pMode = 06
23350 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
23360 20 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45   *pMode = SQLITE
23370 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
23380 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 7d 0a 20  RMISSIONS;.  }. 
23390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
233a0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69  *.** Open the fi
233b0 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a  le zPath..** .**
233c0 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65   Previously, the
233d0 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72   SQLite OS layer
233e0 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63   used three func
233f0 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f  tions in place o
23400 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a  f this.** one:.*
23410 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
23420 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
23430 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
23440 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
23450 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
23460 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
23470 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ();.**.** These 
23480 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64  calls correspond
23490 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
234a0 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  g combinations o
234b0 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
234c0 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d     ReadWrite() -
234d0 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45  >     (READWRITE
234e0 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20   | CREATE).**   
234f0 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e    ReadOnly()  ->
23500 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20       (READONLY) 
23510 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c  .**     OpenExcl
23520 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44  usive() -> (READ
23530 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c  WRITE | CREATE |
23540 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a   EXCLUSIVE).**.*
23550 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78  * The old OpenEx
23560 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74  clusive() accept
23570 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67  ed a boolean arg
23580 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67  ument - "delFlag
23590 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74  ". If.** true, t
235a0 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66  he file was conf
235b0 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74  igured to be aut
235c0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
235d0 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66  ed when the.** f
235e0 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65  ile handle close
235f0 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68  d. To achieve th
23600 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73  e same effect us
23610 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a  ing this new .**
23620 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20   interface, add 
23630 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  the DELETEONCLOS
23640 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20  E flag to those 
23650 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20  specified above 
23660 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c  for .** OpenExcl
23670 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  usive()..*/.stat
23680 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28  ic int unixOpen(
23690 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
236a0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
236b0 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77  /* The VFS for w
236c0 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65  hich this is the
236d0 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f   xOpen method */
236e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
236f0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
23700 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66  /* Pathname of f
23710 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ile to be opened
23720 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
23730 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
23740 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
23750 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
23760 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69  filled in */.  i
23770 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
23780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23790 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f  nput flags to co
237a0 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e  ntrol the openin
237b0 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  g */.  int *pOut
237c0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
237d0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c      /* Output fl
237e0 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ags returned to 
237f0 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29  SQLite core */.)
23800 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
23810 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46  = (unixFile *)pF
23820 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20  ile;.  int fd = 
23830 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
23840 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
23850 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65  scriptor returne
23860 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  d by open() */. 
23870 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c  /* Directory fil
238a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
238b0 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
238c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
238d0 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
238e0 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  s to open() */. 
238f0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
23900 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
23910 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
23920 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
23930 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
23940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23950 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b  rue to omit lock
23960 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a  ing primitives *
23970 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
23980 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
23990 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
239a0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20  eturn Code */.. 
239b0 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
239c0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
239d0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
239e0 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
239f0 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
23a00 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
23a10 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
23a20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
23a30 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
23a40 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
23a50 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
23a60 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
23a70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23a80 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
23a90 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
23aa0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23ab0 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
23ac0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
23ad0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
23ae0 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
23af0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23b00 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
23b10 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
23b20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61  If creating a ma
23b30 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c  ster or main-fil
23b40 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20  e journal, this 
23b50 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70  function will op
23b60 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64  en.  ** a file-d
23b70 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
23b80 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20   directory too. 
23b90 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75  The first time u
23ba0 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69  nixSync().  ** i
23bb0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72  s called the dir
23bc0 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
23bd0 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66  riptor will be f
23be0 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f  sync()ed and clo
23bf0 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e  se()d..  */.  in
23c00 74 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  t isOpenDirector
23c10 79 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  y = (isCreate &&
23c20 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
23c30 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
23c40 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
23c50 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
23c60 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
23c70 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
23c80 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23c90 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f  N_WAL.  ));..  /
23ca0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
23cb0 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
23cc0 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
23cd0 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
23ce0 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
23cf0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
23d00 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
23d10 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
23d20 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
23d30 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
23d40 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
23d50 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23d60 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20  Name = zPath;.. 
23d70 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
23d80 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
23d90 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
23da0 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
23db0 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
23dc0 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
23dd0 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
23de0 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
23df0 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
23e00 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
23e10 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
23e20 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
23e30 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
23e40 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
23e50 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
23e60 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
23e70 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
23e80 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
23e90 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
23ea0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
23eb0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
23ec0 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
23ed0 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
23ee0 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
23ef0 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
23f00 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
23f10 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
23f20 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
23f30 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
23f40 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
23f50 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
23f60 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
23f70 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
23f80 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
23f90 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
23fa0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
23fb0 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
23fc0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
23fd0 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
23fe0 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
23ff0 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
24000 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
24010 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
24020 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
24030 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
24040 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
24050 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
24060 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
24070 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
24080 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
24090 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
240a0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
240b0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
240c0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
240d0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
240e0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
240f0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
24100 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
24110 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
24120 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
24130 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
24140 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
24150 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
24160 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
24170 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
24180 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
24190 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
241a0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
241b0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
241c0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
241d0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
241e0 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
241f0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24200 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
24210 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24220 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
24230 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
24240 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24250 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
24260 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24270 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
24280 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
24290 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
242a0 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d  );..  if( eType=
242b0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
242c0 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78  N_DB ){.    Unix
242d0 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
242e0 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  d;.    pUnused =
242f0 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
24300 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20  zName, flags);. 
24310 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
24320 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e  {.      fd = pUn
24330 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65  used->fd;.    }e
24340 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73  lse{.      pUnus
24350 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
24360 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  loc(sizeof(*pUnu
24370 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28  sed));.      if(
24380 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
24390 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
243a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
243b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  }.    }.    p->p
243c0 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
243d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a  ;.  }else if( !z
243e0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Name ){.    /* I
243f0 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c  f zName is NULL,
24400 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
24410 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61   is requesting a
24420 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20   temp file. */. 
24430 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65     assert(isDele
24440 74 65 20 26 26 20 21 69 73 4f 70 65 6e 44 69 72  te && !isOpenDir
24450 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 72 63 20  ectory);.    rc 
24460 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  = unixGetTempnam
24470 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e(MAX_PATHNAME+1
24480 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
24490 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
244a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
244b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
244c0 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
244d0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  e;.  }..  /* Det
244e0 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
244f0 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61   of the flags pa
24500 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74  rameter passed t
24510 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e  o POSIX function
24520 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68  .  ** open(). Th
24530 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63  ese must be calc
24540 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f  ulated even if o
24550 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  pen() is not cal
24560 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65  led, as.  ** the
24570 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  y may be stored 
24580 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  as part of the f
24590 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75  ile handle and u
245a0 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  sed by the .  **
245b0 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f   'conch file' lo
245c0 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20  cking functions 
245d0 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20  later on.  */.  
245e0 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
245f0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
24600 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69  _RDONLY;.  if( i
24610 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65  sReadWrite ) ope
24620 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52  nFlags |= O_RDWR
24630 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65  ;.  if( isCreate
24640 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20   )    openFlags 
24650 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66  |= O_CREAT;.  if
24660 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20  ( isExclusive ) 
24670 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
24680 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29  EXCL|O_NOFOLLOW)
24690 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  ;.  openFlags |=
246a0 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f   (O_LARGEFILE|O_
246b0 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20  BINARY);..  if( 
246c0 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65  fd<0 ){.    mode
246d0 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
246e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
246f0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
24700 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
24710 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65      rc = findCre
24720 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d  ateFileMode(zNam
24730 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d  e, flags, &openM
24740 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
24750 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24760 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
24770 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20  >pUnused );.    
24780 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24790 20 7d 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e   }.    fd = open
247a0 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
247b0 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
247c0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
247d0 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c  X   %-3d %s 0%o\
247e0 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f  n", fd, zName, o
247f0 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  penFlags));.    
24800 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
24810 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52  o!=EISDIR && isR
24820 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
24830 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
24840 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f    /* Failed to o
24850 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72  pen the file for
24860 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
24870 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c  ss. Try read-onl
24880 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67  y. */.      flag
24890 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50  s &= ~(SQLITE_OP
248a0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
248b0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
248c0 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
248d0 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f  s &= ~(O_RDWR|O_
248e0 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c  CREAT);.      fl
248f0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
24900 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
24910 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
24920 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  O_RDONLY;.      
24930 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c  fd = open(zName,
24940 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
24950 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mode);.    }.   
24960 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
24970 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
24980 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
24990 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
249a0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
249b0 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d  }.  assert( fd>=
249c0 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46  0 );.  if( pOutF
249d0 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75  lags ){.    *pOu
249e0 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
249f0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55    }..  if( p->pU
24a00 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  nused ){.    p->
24a10 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
24a20 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  ;.    p->pUnused
24a30 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
24a40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65  .  }..  if( isDe
24a50 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56  lete ){.#if OS_V
24a60 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68  XWORKS.    zPath
24a70 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a   = zName;.#else.
24a80 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65      unlink(zName
24a90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
24aa0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
24ab0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
24ac0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
24ad0 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
24ae0 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  gs;.  }.#endif..
24af0 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65    if( isOpenDire
24b00 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63 20  ctory ){.    rc 
24b10 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
24b20 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
24b30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
24b50 2a 20 49 74 20 69 73 20 73 61 66 65 20 74 6f 20  * It is safe to 
24b60 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68 69 73  close fd at this
24b70 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73 65 20   point, because 
24b80 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
24b90 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f   not.      ** to
24ba0 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61   be open on a da
24bb0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
24bc0 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e 20  it were open on 
24bd0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
24be0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77 6f 75  .      ** it wou
24bf0 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74  ld not be safe t
24c00 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69 73 20  o close as this 
24c10 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20 61 6e  would release an
24c20 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20 20  y locks held.   
24c30 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c     ** on the fil
24c40 65 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 73  e by this proces
24c50 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  s.  */.      ass
24c60 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49  ert( eType!=SQLI
24c70 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
24c80 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66  );.      close(f
24c90 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d);             
24ca0 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
24cb0 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64   if fail, alread
24cc0 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
24cd0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
24ce0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
24cf0 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  }..#ifdef FD_CLO
24d00 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c  EXEC.  fcntl(fd,
24d10 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28   F_SETFD, fcntl(
24d20 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
24d30 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
24d40 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
24d50 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
24d60 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20  OPEN_MAIN_DB;.. 
24d70 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
24d80 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
24d90 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
24da0 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74  G_STYLE.  struct
24db0 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
24dc0 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64    if( fstatfs(fd
24dd0 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
24de0 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
24df0 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74  le*)pFile)->last
24e00 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
24e10 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20     if( dirfd>=0 
24e20 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20  ) close(dirfd); 
24e30 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
24e40 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72   if fail, in err
24e50 6f 72 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28  or */.    close(
24e60 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  fd); /* silently
24e70 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69   leak if fail, i
24e80 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
24e90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
24ea0 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20  RR_ACCESS;.  }. 
24eb0 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
24ec0 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66  p("msdos", fsInf
24ed0 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
24ee0 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
24ef0 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
24f00 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
24f10 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
24f20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
24f30 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
24f40 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
24f50 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45  #if SQLITE_PREFE
24f60 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
24f70 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20    isAutoProxy = 
24f80 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
24f90 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28  isAutoProxy && (
24fa0 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20  zPath!=NULL) && 
24fb0 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66  (!noLock) && pVf
24fc0 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  s->xOpen ){.    
24fd0 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d  char *envforce =
24fe0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
24ff0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
25000 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75  ING");.    int u
25010 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20  seProxy = 0;..  
25020 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43    /* SQLITE_FORC
25030 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d  E_PROXY_LOCKING=
25040 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61  =1 means force a
25050 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c  lways use proxy,
25060 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a   0 means .    **
25070 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79   never use proxy
25080 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65  , NULL means use
25090 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c   proxy for non-l
250a0 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e  ocal files only.
250b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76    */.    if( env
250c0 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20  force!=NULL ){. 
250d0 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
250e0 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30  atoi(envforce)>0
250f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25100 20 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73     struct statfs
25110 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69   fsInfo;.      i
25120 66 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c  f( statfs(zPath,
25130 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
25140 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
25150 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f   theory, the clo
25160 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73  se(fd) call is s
25170 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74  ub-optimal. If t
25180 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20  he file opened. 
25190 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66         ** with f
251a0 64 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  d is a database 
251b0 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
251c0 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  are other connec
251d0 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20  tions open.     
251e0 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69     ** on that fi
251f0 6c 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  le that are curr
25200 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64  ently holding ad
25210 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20  visory locks on 
25220 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  it,.        ** t
25230 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hen the call to 
25240 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e  close() will can
25250 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  cel those locks.
25260 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20   In practice,.  
25270 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61        ** we're a
25280 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61  ssuming that sta
25290 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61  tfs() doesn't fa
252a0 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41  il very often. A
252b0 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
252c0 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68  ** not while oth
252d0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
252e0 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ors opened by th
252f0 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f  e same process o
25300 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
25310 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77   same file are w
25320 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20  orking.  */.    
25330 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f      p->lastErrno
25340 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
25350 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
25360 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
25370 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c  e(dirfd); /* sil
25380 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
25390 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  il, in error */.
253a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
253b0 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
253c0 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66  silently leak if
253d0 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20   fail, in error 
253e0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
253f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
25400 45 53 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ESS;.        got
25410 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
25420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
25430 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e  seProxy = !(fsIn
25440 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c  fo.f_flags&MNT_L
25450 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  OCAL);.    }.   
25460 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b   if( useProxy ){
25470 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c  .      rc = fill
25480 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
25490 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c   fd, dirfd, pFil
254a0 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b  e, zPath, noLock
254b0 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 20 20 20  , isDelete);.   
254c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
254d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
254e0 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
254f0 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69  ormUnixFile((uni
25500 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a  xFile*)pFile, ":
25510 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20  auto:");.       
25520 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25530 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
25540 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65  /* Use unixClose
25550 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65   to clean up the
25560 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64   resources added
25570 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69   in fillInUnixFi
25580 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le .          **
25590 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74   and clear all t
255a0 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72  he structure's r
255b0 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63  eferences.  Spec
255c0 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20  ifically, .     
255d0 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70       ** pFile->p
255e0 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20  Methods will be 
255f0 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f  NULL so sqlite3O
25600 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61  sClose will be a
25610 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20   no-op .        
25620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
25630 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b  nixClose(pFile);
25640 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
25650 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
25660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
25670 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
25680 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
25690 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  if.  .  rc = fil
256a0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
256b0 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69  , fd, dirfd, pFi
256c0 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63  le, zPath, noLoc
256d0 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 6f 70  k, isDelete);.op
256e0 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  en_finished:.  i
256f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
25710 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29  free(p->pUnused)
25720 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
25730 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  c;.}.../*.** Del
25740 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
25750 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
25760 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
25770 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
25780 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
25790 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
257a0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
257b0 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
257c0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
257d0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
257e0 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
257f0 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
25800 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
25810 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
25820 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
25830 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
25840 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
25850 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
25860 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
25870 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
25880 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
25890 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
258a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
258b0 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
258c0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
258d0 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
258e0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
258f0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
25900 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28  );.  if( unlink(
25910 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20  zPath)==(-1) && 
25920 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
25930 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25940 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b  TE_IOERR_DELETE;
25950 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
25960 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
25970 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e  YNC.  if( dirSyn
25980 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b  c ){.    int fd;
25990 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
259a0 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
259b0 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
259c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
259d0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
259e0 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29     if( fsync(fd)
259f0 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20  ==-1 ).#else.   
25a00 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29     if( fsync(fd)
25a10 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
25a20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
25a30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
25a40 46 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20  FSYNC;.      }. 
25a50 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 66       if( close(f
25a60 64 29 26 26 21 72 63 20 29 7b 0a 20 20 20 20 20  d)&&!rc ){.     
25a70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
25a80 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a  OERR_DIR_CLOSE;.
25a90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25aa0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
25ab0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
25ac0 65 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63  est the existanc
25ad0 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
25ae0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
25af0 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
25b00 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
25b10 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
25b20 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
25b30 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
25b40 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
25b50 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
25b60 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
25b70 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
25b80 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
25b90 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
25ba0 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
25bb0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
25bc0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
25bd0 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
25be0 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
25bf0 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
25c00 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
25c10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
25c20 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
25c30 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
25c40 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
25c50 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
25c60 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
25c70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25c80 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
25c90 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
25ca0 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
25cb0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
25cc0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
25cd0 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
25ce0 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
25cf0 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
25d00 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
25d10 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25d20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
25d30 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
25d40 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55  amode = 0;.  UNU
25d50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
25d60 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
25d70 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
25d80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
25d90 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74  CCESS; );.  swit
25da0 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
25db0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
25dc0 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
25dd0 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a    amode = F_OK;.
25de0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25df0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
25e00 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
25e10 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f       amode = W_O
25e20 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  K|R_OK;.      br
25e30 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
25e40 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
25e50 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
25e60 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
25e70 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
25e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
25e90 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
25ea0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
25eb0 2a 70 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65  *pResOut = (acce
25ec0 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29  ss(zPath, amode)
25ed0 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  ==0);.  if( flag
25ee0 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
25ef0 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65 73  _EXISTS && *pRes
25f00 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  Out ){.    struc
25f10 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
25f20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74  if( 0==stat(zPat
25f30 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e  h, &buf) && buf.
25f40 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  st_size==0 ){.  
25f50 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30      *pResOut = 0
25f60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25f70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25f80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  }.../*.** Turn a
25f90 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
25fa0 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
25fb0 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
25fc0 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
25fd0 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
25fe0 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
25ff0 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
26000 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
26010 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
26020 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
26030 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
26040 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
26050 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
26060 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
26070 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
26080 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
26090 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
260a0 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
260b0 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
260c0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
260d0 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
260e0 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
260f0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
26100 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
26110 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
26120 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26130 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
26140 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
26150 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
26160 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26180 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
26190 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
261a0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
261b0 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
261c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
261d0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
261e0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
261f0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
26200 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
26210 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
26220 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
26230 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
26240 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
26250 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
26260 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
26270 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
26280 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
26290 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
262a0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
262b0 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
262c0 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
262d0 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  y has been unlin
262e0 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ked..  */.  Simu
262f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
26300 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
26310 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
26320 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d  Vfs->mxPathname=
26330 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b  =MAX_PATHNAME );
26340 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
26350 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f  TER(pVfs);..  zO
26360 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30  ut[nOut-1] = '\0
26370 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  ';.  if( zPath[0
26380 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71  ]=='/' ){.    sq
26390 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
263a0 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c  Out, zOut, "%s",
263b0 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65   zPath);.  }else
263c0 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a  {.    int nCwd;.
263d0 20 20 20 20 69 66 28 20 67 65 74 63 77 64 28 7a      if( getcwd(z
263e0 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20  Out, nOut-1)==0 
263f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
26400 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
26410 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
26420 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c  nCwd = (int)strl
26430 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  en(zOut);.    sq
26440 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
26450 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b  Out-nCwd, &zOut[
26460 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50  nCwd], "/%s", zP
26470 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ath);.  }.  retu
26480 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26490 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
264a0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
264b0 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
264c0 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
264d0 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
264e0 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
264f0 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
26500 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
26510 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
26520 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
26530 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  brary..*/.#inclu
26540 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61  de <dlfcn.h>.sta
26550 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
26560 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
26570 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *NotUsed, const
26580 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
26590 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
265a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
265b0 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28    return dlopen(
265c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f  zFilename, RTLD_
265d0 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41  NOW | RTLD_GLOBA
265e0 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  L);.}../*.** SQL
265f0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
26600 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74  unction immediat
26610 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ely after a call
26620 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20   to unixDlSym() 
26630 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e  or.** unixDlOpen
26640 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e  () fails (return
26650 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
26660 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74  ). If a more det
26670 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  ailed error.** m
26680 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61  essage is availa
26690 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74  ble, it is writt
266a0 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49  en to zBufOut. I
266b0 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  f no error messa
266c0 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ge.** is availab
266d0 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c  le, zBufOut is l
266e0 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61  eft unmodified a
266f0 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61  nd SQLite uses a
26700 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f   default.** erro
26710 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
26720 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
26730 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
26740 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
26750 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
26760 4f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  Out){.  char *zE
26770 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rr;.  UNUSED_PAR
26780 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
26790 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
267a0 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c  x();.  zErr = dl
267b0 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a  error();.  if( z
267c0 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
267d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
267e0 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c  , zBufOut, "%s",
267f0 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e   zErr);.  }.  un
26800 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
26810 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
26820 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65  unixDlSym(sqlite
26830 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
26840 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63  void *p, const c
26850 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  har*zSym))(void)
26860 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43  {.  /* .  ** GCC
26870 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
26880 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74  errors says that
26890 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c   C90 does not al
268a0 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62  low a void* to b
268b0 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f  e.  ** cast into
268c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
268d0 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79  function.  And y
268e0 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64  et the library d
268f0 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20  lsym() routine. 
26900 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f   ** returns a vo
26910 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61  id* which is rea
26920 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
26930 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f   a function.  So
26940 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20   how do we.  ** 
26950 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68  use dlsym() with
26960 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
26970 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72  s?.  **.  ** Var
26980 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73  iable x below is
26990 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61   defined to be a
269a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
269b0 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20  nction taking.  
269c0 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f  ** parameters vo
269d0 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68  id* and const ch
269e0 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e  ar* and returnin
269f0 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  g a pointer to a
26a00 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
26a10 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20  We initialize x 
26a20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  by assigning it 
26a30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
26a40 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f   dlsym() functio
26a50 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73  n..  ** (That as
26a60 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  signment require
26a70 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e  s a cast.)  Then
26a80 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e   we call the fun
26a90 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20  ction that.  ** 
26aa0 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20  x points to.  . 
26ab0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f   **.  ** This wo
26ac0 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c  rk-around is unl
26ad0 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f  ikely to work co
26ae0 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73  rrectly on any s
26af0 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a  ystem where.  **
26b00 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e   you really cann
26b10 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69  ot cast a functi
26b20 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20  on pointer into 
26b30 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e  void*.  But then
26b40 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74  , on the.  ** ot
26b50 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28  her hand, dlsym(
26b60 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  ) will not work 
26b70 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d  on such a system
26b80 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68   either, so we h
26b90 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61  ave.  ** not rea
26ba0 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e  lly lost anythin
26bb0 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28  g..  */.  void (
26bc0 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  *(*x)(void*,cons
26bd0 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b  t char*))(void);
26be0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
26bf0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
26c00 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76  x = (void(*(*)(v
26c10 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
26c20 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a  ))(void))dlsym;.
26c30 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c    return (*x)(p,
26c40 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63   zSym);.}.static
26c50 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73   void unixDlClos
26c60 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
26c70 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48  otUsed, void *pH
26c80 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
26c90 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
26ca0 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70  ed);.  dlclose(p
26cb0 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65  Handle);.}.#else
26cc0 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d   /* if SQLITE_OM
26cd0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
26ce0 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f  N is defined: */
26cf0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
26d00 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
26d10 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30  ne unixDlError 0
26d20 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
26d30 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69  lSym   0.  #defi
26d40 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30  ne unixDlClose 0
26d50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
26d60 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20  rite nBuf bytes 
26d70 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74  of random data t
26d80 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  o the supplied b
26d90 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73  uffer zBuf..*/.s
26da0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61  tatic int unixRa
26db0 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
26dc0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
26dd0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
26de0 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
26df0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
26e00 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a  );.  assert((siz
26e10 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f  e_t)nBuf>=(sizeo
26e20 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66  f(time_t)+sizeof
26e30 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57  (int)));..  /* W
26e40 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61  e have to initia
26e50 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65  lize zBuf to pre
26e60 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72  vent valgrind fr
26e70 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a  om reporting.  *
26e80 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72  * errors.  The r
26e90 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79  eports issued by
26ea0 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e   valgrind are in
26eb0 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75  correct - we wou
26ec0 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74  ld.  ** prefer t
26ed0 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65  hat the randomne
26ee0 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ss be increased 
26ef0 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66  by making use of
26f00 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74   the.  ** uninit
26f10 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e  ialized space in
26f20 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67   zBuf - but valg
26f30 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64  rind errors tend
26f40 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73   to worry.  ** s
26f50 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68  ome users.  Rath
26f60 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69  er than argue, i
26f70 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a  t seems easier j
26f80 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ust to initializ
26f90 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65  e.  ** the whole
26fa0 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e   array and silen
26fb0 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65  ce valgrind, eve
26fc0 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
26fd0 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a  less randomness.
26fe0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64    ** in the rand
26ff0 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20  om seed..  **.  
27000 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c  ** When testing,
27010 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42   initializing zB
27020 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20  uf[] to zero is 
27030 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74  all we do.  That
27040 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
27050 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
27060 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e  he same random n
27070 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20  umber sequence. 
27080 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a   This makes the.
27090 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61    ** tests repea
270a0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65  table..  */.  me
270b0 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
270c0 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  uf);.#if !define
270d0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
270e0 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20   {.    int pid, 
270f0 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65  fd;.    fd = ope
27100 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
27110 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20  , O_RDONLY);.   
27120 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
27130 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
27140 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20     time(&t);.   
27150 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
27160 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
27170 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70        pid = getp
27180 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  id();.      memc
27190 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
271a0 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  t)], &pid, sizeo
271b0 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61  f(pid));.      a
271c0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29  ssert( sizeof(t)
271d0 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73  +sizeof(pid)<=(s
271e0 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20  ize_t)nBuf );.  
271f0 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f      nBuf = sizeo
27200 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69  f(t) + sizeof(pi
27210 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
27220 20 20 20 20 20 6e 42 75 66 20 3d 20 72 65 61 64       nBuf = read
27230 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29  (fd, zBuf, nBuf)
27240 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64  ;.      close(fd
27250 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
27260 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75  dif.  return nBu
27270 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  f;.}.../*.** Sle
27280 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
27290 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
272a0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
272b0 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20  e slept..** The 
272c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
272d0 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
272e0 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74  econds we want t
272f0 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20  o sleep..** The 
27300 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
27310 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
27320 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c  croseconds of sl
27330 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  eep actually.** 
27340 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
27350 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
27360 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
27370 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a  a number which.*
27380 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  * might be great
27390 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
273a0 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74   to the argument
273b0 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a  , but not less.*
273c0 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d  * than the argum
273d0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
273e0 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c  nt unixSleep(sql
273f0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
27400 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f  d, int microseco
27410 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  nds){.#if OS_VXW
27420 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
27430 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70  mespec sp;..  sp
27440 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73  .tv_sec = micros
27450 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30  econds / 1000000
27460 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d  ;.  sp.tv_nsec =
27470 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25   (microseconds %
27480 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30   1000000) * 1000
27490 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73  ;.  nanosleep(&s
274a0 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53  p, NULL);.  UNUS
274b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
274c0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
274d0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
274e0 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  lif defined(HAVE
274f0 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
27500 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
27510 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a  (microseconds);.
27520 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27530 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
27540 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
27550 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  ds;.#else.  int 
27560 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f  seconds = (micro
27570 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f  seconds+999999)/
27580 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70  1000000;.  sleep
27590 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  (seconds);.  UNU
275a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
275b0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
275c0 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30   seconds*1000000
275d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
275e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
275f0 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
27600 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
27610 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
27620 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
27630 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
27640 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
27650 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
27660 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
27670 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
27680 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
27690 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
276a0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
276b0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
276c0 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
276d0 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
276e0 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
276f0 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
27700 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
27710 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
27720 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
27730 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
27740 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
27750 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
27760 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
27770 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
27780 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
27790 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
277a0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
277b0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
277c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
277d0 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
277e0 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
277f0 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
27800 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
27810 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
27820 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
27830 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
27840 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
27850 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
27860 65 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20  ess, return 0.  
27870 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
27880 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
27890 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
278a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
278b0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
278c0 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  4(sqlite3_vfs *N
278d0 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f  otUsed, sqlite3_
278e0 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
278f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
27900 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
27910 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
27920 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
27930 38 36 34 30 30 30 30 3b 0a 23 69 66 20 64 65 66  8640000;.#if def
27940 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
27950 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
27960 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
27970 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
27980 36 34 29 69 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)i)*1000 + uni
27990 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
279a0 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
279b0 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
279c0 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
279d0 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
279e0 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
279f0 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
27a00 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
27a10 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
27a20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
27a30 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
27a40 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
27a50 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66  Now;.  gettimeof
27a60 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20  day(&sNow, 0);. 
27a70 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
27a80 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
27a90 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
27aa0 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
27ab0 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69  usec/1000;.#endi
27ac0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
27ad0 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
27ae0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
27af0 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
27b00 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
27b10 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
27b20 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
27b30 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
27b40 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
27b50 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
27b60 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
27b70 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
27b80 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
27b90 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
27ba0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
27bb0 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
27bc0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
27bd0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
27be0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
27bf0 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
27c00 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
27c10 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
27c20 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
27c30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
27c40 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
27c50 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
27c60 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
27c70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33  rNow){.  sqlite3
27c80 5f 69 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55 53  _int64 i;.  UNUS
27c90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
27ca0 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 43 75 72  Used);.  unixCur
27cb0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
27cc0 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
27cd0 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
27ce0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
27cf0 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65  .** We added the
27d00 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
27d10 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65   method with the
27d20 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72   intention of pr
27d30 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65  oviding.** bette
27d40 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  r low-level erro
27d50 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20  r messages when 
27d60 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
27d70 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
27d80 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
27d90 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  te operation.  B
27da0 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20  ut so far, none 
27db0 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  of that has been
27dc0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
27dd0 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f  in the core.  So
27de0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
27df0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
27e00 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d  For now, it is m
27e10 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65  erely.** a place
27e20 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  -holder..*/.stat
27e30 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
27e40 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
27e50 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
27e60 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
27e70 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
27e80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27e90 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
27ea0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
27eb0 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
27ec0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
27ed0 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ed3);.  return 0
27ee0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*.*******
27ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f00 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  * End of sqlite3
27f10 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
27f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f30 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
27f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f80 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
27f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
27fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ff0 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79  **** Begin Proxy
28000 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
28010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28020 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
28030 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
28040 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67   a "uber-locking
28050 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73  -method" in this
28060 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73   sense:  It uses
28070 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f   the.** other lo
28080 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
28090 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20   secondary lock 
280a0 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f  files.  Proxy lo
280b0 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65  cking is a.** me
280c0 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f  ta-layer over to
280d0 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69  p of the primiti
280e0 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ve locking imple
280f0 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46  mented above.  F
28100 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f  or.** this reaso
28110 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
28120 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
28130 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
28140 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20   is deferred.** 
28150 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68  until late in th
28160 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66  e file (here) af
28170 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f  ter all of the o
28180 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73  ther I/O methods
28190 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65   have.** been de
281a0 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20  fined - so that 
281b0 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
281c0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72  cking methods ar
281d0 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61  e available.** a
281e0 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65  s services to he
281f0 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c  lp with the impl
28200 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72  ementation of pr
28210 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  oxy locking..**.
28220 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
28230 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73  efault locking s
28240 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65  chemes in SQLite
28250 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20   use byte-range 
28260 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  locks on the.** 
28270 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
28280 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65   coordinate safe
28290 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63  , concurrent acc
282a0 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  ess by multiple 
282b0 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77  readers.** and w
282c0 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73  riters [http://s
282d0 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e  qlite.org/lockin
282e0 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20  gv3.html].  The 
282f0 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  five file lockin
28300 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c  g.** states (UNL
28310 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20  OCKED, PENDING, 
28320 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
28330 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65  , EXCLUSIVE) are
28340 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
28350 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20  as POSIX read & 
28360 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72  write locks over
28370 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f   fixed set of lo
28380 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63  cations (via fsc
28390 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61  tl),.** on AFP a
283a0 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c  nd SMB only excl
283b0 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
283c0 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c   locks are avail
283d0 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a  able via fsctl.*
283e0 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27  * with _IOWR('z'
283f0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
28400 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74  eRangeLockPB2) t
28410 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65  o track the same
28420 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f   5 states..** To
28430 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44   simulate a F_RD
28440 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65  LCK on the share
28450 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20  d range, on AFP 
28460 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  a randomly selec
28470 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69  ted.** address i
28480 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
28490 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
284a0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
284b0 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61  he entire.** sha
284c0 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
284d0 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53  en for an EXCLUS
284e0 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a  IVE lock):.**.**
284f0 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
28500 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  TE        0x4000
28510 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20  0000..   ..**   
28520 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
28530 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
28540 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
28550 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
28560 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
28570 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
28580 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
28590 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
285a0 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
285b0 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
285c0 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
285d0 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
285e0 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
285f0 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
28600 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
28610 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
28620 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
28630 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
28640 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
28650 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
28660 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
28670 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
28680 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
28690 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
286a0 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
286b0 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
286c0 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
286d0 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
286e0 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
286f0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
28700 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
28710 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
28720 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
28730 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
28740 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
28750 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
28760 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
28770 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
28780 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
28790 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
287a0 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
287b0 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
287c0 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
287d0 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
287e0 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
287f0 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
28800 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
28810 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
28820 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
28830 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
28840 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
28850 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
28860 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
28870 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
28880 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
28890 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
288a0 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
288b0 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
288c0 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
288d0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
288e0 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
288f0 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
28900 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
28910 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
28920 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
28930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
28940 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
28950 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
28960 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
28970 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ame, SQLITE_SET_
28980 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
28990 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
289a0 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70          <proxy_p
289b0 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29  ath> | ":auto:")
289c0 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.**  sqlite3_fi
289d0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
289e0 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45  bname, SQLITE_GE
289f0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
28a00 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b   &<proxy_path>);
28a10 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72  .**.**.** SQL pr
28a20 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41  agmas.**.**  PRA
28a30 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
28a40 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c  ock_proxy_file=<
28a50 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61  proxy_path> | :a
28a60 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  uto:.**  PRAGMA 
28a70 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
28a80 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a  proxy_file.**.**
28a90 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75   Specifying ":au
28aa0 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20  to:" means that 
28ab0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  if there is a co
28ac0 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20  nch file with a 
28ad0 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74  matching.** host
28ae0 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70   ID in it, the p
28af0 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65  roxy path in the
28b00 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
28b10 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77   be used, otherw
28b20 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70  ise.** a proxy p
28b30 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ath based on the
28b40 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72   user's temp dir
28b50 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72  .** (via confstr
28b60 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
28b70 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20  _TEMP_DIR,...)) 
28b80 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64  will be used and
28b90 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70   the.** actual p
28ba0 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  roxy file name i
28bb0 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
28bc0 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61   the name and pa
28bd0 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  th of the.** dat
28be0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72  abase file.  For
28bf0 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
28c00 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61        For databa
28c10 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f  se path "/Users/
28c20 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20  me/foo.db" .**  
28c30 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61       The lock pa
28c40 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70  th will be "<tmp
28c50 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b  dir>/sqliteplock
28c60 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e  s/_Users_me_foo.
28c70 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a  db:auto:").**.**
28c80 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f   Once a lock pro
28c90 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  xy is configured
28ca0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
28cb0 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63  connection, it c
28cc0 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d  an not.** be rem
28cd0 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74  oved, however it
28ce0 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64   may be switched
28cf0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
28d00 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a  proxy path via.*
28d10 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73  * the above APIs
28d20 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63   (assuming the c
28d30 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74  onch file is not
28d40 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61   being held by a
28d50 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63  nother.** connec
28d60 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29  tion or process)
28d70 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20  . .**.**.** How 
28d80 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f  proxy locking wo
28d90 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  rks.** ---------
28da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
28db0 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20  *.** Proxy file 
28dc0 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70  locking relies p
28dd0 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20  rimarily on two 
28de0 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66  new supporting f
28df0 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  iles: .**.**   *
28e00 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20    conch file to 
28e10 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20  limit access to 
28e20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28e30 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f  e to a single ho
28e40 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20  st.**      at a 
28e50 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  time.**.**   *  
28e60 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63  proxy file to ac
28e70 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72  t as a proxy for
28e80 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f   the advisory lo
28e90 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  cks normally.** 
28ea0 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68       taken on th
28eb0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  e database.**.**
28ec0 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
28ed0 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79  - to use a proxy
28ee0 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75   file, sqlite mu
28ef0 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74  st first "hold t
28f00 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20  he conch".** by 
28f10 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  taking an sqlite
28f20 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f  -style shared lo
28f30 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
28f40 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68  file, reading th
28f50 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e  e.** contents an
28f60 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  d comparing the 
28f70 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f  host's unique ho
28f80 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77  st ID (see below
28f90 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72  ) and lock.** pr
28fa0 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74  oxy path against
28fb0 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
28fc0 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e  ed in the conch.
28fd0 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65    The conch file
28fe0 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e   is.** stored in
28ff0 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
29000 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62  ory as the datab
29010 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
29020 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73   file name.** is
29030 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72   patterned after
29040 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29050 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61  le name as ".<da
29060 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63  tabasename>-conc
29070 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  h"..** If the co
29080 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nch file does no
29090 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73  t exist, or it's
290a0 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
290b0 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f   match the.** ho
290c0 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f  st ID and/or pro
290d0 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68  xy path, then th
290e0 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61  e lock is escala
290f0 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73  ted to an exclus
29100 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20  ive.** lock and 
29110 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  the conch file c
29120 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74  ontents is updat
29130 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74  ed with the host
29140 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a   ID and proxy.**
29150 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f   path and the lo
29160 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64  ck is downgraded
29170 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
29180 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65  k again.  If the
29190 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c   conch.** is hel
291a0 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f  d by another pro
291b0 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61  cess (with a sha
291c0 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65  red lock), the e
291d0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
291e0 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53   will fail and S
291f0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
29200 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
29210 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61  e proxy file - a
29220 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c   single-byte fil
29230 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61  e used for all a
29240 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63  dvisory file loc
29250 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74  ks.** normally t
29260 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
29270 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69  base file.   Thi
29280 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66  s allows for saf
29290 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20  e sharing.** of 
292a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
292b0 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72  e for multiple r
292c0 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
292d0 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  rs on the same.*
292e0 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63  * host (the conc
292f0 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  h ensures that t
29300 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20  hey all use the 
29310 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  same local lock 
29320 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71  file)..**.** Req
29330 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b  uesting the lock
29340 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20   proxy does not 
29350 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65  immediately take
29360 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69   the conch, it i
29370 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  s.** only taken 
29380 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72  when the first r
29390 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64  equest to lock d
293a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
293b0 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20  made.  .** This 
293c0 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61  matches the sema
293d0 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61  ntics of the tra
293e0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
293f0 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65   behavior, where
29400 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f  .** opening a co
29410 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61  nnection to a da
29420 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73  tabase file does
29430 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b   not take a lock
29440 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73   on it..** The s
29450 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61  hared lock and a
29460 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  n open file desc
29470 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74  riptor are maint
29480 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20  ained until .** 
29490 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
294a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
294b0 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a  s closed. .**.**
294c0 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
294d0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  and the lock fil
294e0 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65  e are never dele
294f0 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79  ted so they only
29500 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63   need.** to be c
29510 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74  reated the first
29520 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75   time they are u
29530 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  sed..**.** Confi
29540 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
29550 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
29560 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
29570 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
29580 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a  ROXY_LOCKING.**.
29590 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73  **       Databas
295a0 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64  e files accessed
295b0 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69   on non-local fi
295c0 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a  le systems are.*
295d0 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69  *       automati
295e0 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  cally configured
295f0 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
29600 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  ng, lock files a
29610 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  re.**       name
29620 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
29630 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c  using the same l
29640 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20  ogic as.**      
29650 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f   PRAGMA lock_pro
29660 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22  xy_file=":auto:"
29670 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49  .**    .**  SQLI
29680 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a  TE_PROXY_DEBUG.*
29690 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c  *.**       Enabl
296a0 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f  es the logging o
296b0 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  f error messages
296c0 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20   during host id 
296d0 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65  file.**       re
296e0 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61  trieval and crea
296f0 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
29700 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
29710 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
29720 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
29730 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
29740 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
29750 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
29760 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
29770 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
29780 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
29790 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
297a0 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
297b0 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
297c0 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
297d0 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
297e0 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
297f0 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
29800 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
29810 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
29820 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
29830 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
29840 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
29850 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
29860 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
29870 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
29880 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
29890 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
298a0 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
298b0 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
298c0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
298d0 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
298e0 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
298f0 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
29900 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
29910 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
29920 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
29930 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
29940 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
29950 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
29960 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
29970 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
29980 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  city calling the
29990 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
299a0 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61  PROXYFILE pragma
299b0 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69   or.** sqlite_fi
299c0 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69  le_control API i
299d0 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62  s not affected b
299e0 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  y SQLITE_FORCE_P
299f0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a  ROXY_LOCKING)..*
29a00 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  /../*.** Proxy l
29a10 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
29a20 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
29a30 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  SX .*/.#if defin
29a40 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
29a50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29a60 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a  OCKING_STYLE../*
29a70 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63  .** The proxyLoc
29a80 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20  kingContext has 
29a90 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c  the path and fil
29aa0 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
29ab0 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20   the remote .** 
29ac0 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20  and local proxy 
29ad0 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74  files in it.*/.t
29ae0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72  ypedef struct pr
29af0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
29b00 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
29b10 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72  ntext;.struct pr
29b20 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
29b30 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t {.  unixFile *
29b40 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20  conchFile;      
29b50 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68     /* Open conch
29b60 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
29b70 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20  *conchFilePath; 
29b80 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
29b90 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  of the conch fil
29ba0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
29bb0 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20  *lockProxy;     
29bc0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78      /* Open prox
29bd0 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
29be0 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79   char *lockProxy
29bf0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
29c00 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
29c10 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
29c20 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20    char *dbPath; 
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29c40 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
29c50 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  en file */.  int
29c60 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20   conchHeld;     
29c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69            /* 1 i
29c80 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68  f the conch is h
29c90 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c  eld, -1 if lockl
29ca0 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  ess */.  void *o
29cb0 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
29cc0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
29cd0 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
29ce0 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
29cf0 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
29d00 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
29d10 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
29d20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
29d30 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
29d40 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
29d50 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
29d60 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
29d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
29d80 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
29d90 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
29da0 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
29db0 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
29dc0 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
29dd0 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
29de0 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
29df0 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
29e00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
29e10 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
29e20 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
29e30 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
29e40 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
29e50 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
29e60 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
29e70 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
29e80 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
29e90 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
29ea0 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
29eb0 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
29ec0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
29ed0 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
29ee0 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
29ef0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
29f00 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
29f10 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
29f20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
29f30 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
29f40 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
29f50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
29f60 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
29f70 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
29f80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29f90 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
29fa0 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74    }.    len = st
29fb0 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
29fc0 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
29fd0 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20  Len);    .  }.# 
29fe0 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72  else.  len = str
29ff0 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d  lcpy(lPath, "/tm
2a000 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20  p/", maxLen);.# 
2a010 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
2a020 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d  if( lPath[len-1]
2a030 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e  !='/' ){.    len
2a040 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
2a050 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  , "/", maxLen);.
2a060 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e    }.  .  /* tran
2a070 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74  sform the db pat
2a080 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61  h to a unique ca
2a090 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62  che name */.  db
2a0a0 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Len = (int)strle
2a0b0 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72  n(dbPath);.  for
2a0c0 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26  ( i=0; i<dbLen &
2a0d0 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74  & (i+len+7)<(int
2a0e0 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  )maxLen; i++){. 
2a0f0 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61     char c = dbPa
2a100 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68  th[i];.    lPath
2a110 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f  [i+len] = (c=='/
2a120 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20  ')?'_':c;.  }.  
2a130 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30  lPath[i+len]='\0
2a140 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61  ';.  strlcat(lPa
2a150 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61  th, ":auto:", ma
2a160 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45  xLen);.  OSTRACE
2a170 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
2a180 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
2a190 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50  %s pid=%d\n", lP
2a1a0 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ath, getpid()));
2a1b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2a1c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20  _OK;.}../* . ** 
2a1d0 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b  Creates the lock
2a1e0 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69   file and any mi
2a1f0 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  ssing directorie
2a200 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a  s in lockPath. *
2a210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2a220 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
2a230 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63  (const char *loc
2a240 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c  kPath){.  int i,
2a250 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66   len;.  char buf
2a260 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
2a270 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20  int start = 0;. 
2a280 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50   .  assert(lockP
2a290 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a  ath!=NULL);.  /*
2a2a0 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
2a2b0 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  ll the intermedi
2a2c0 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20  ate directories 
2a2d0 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29  */.  len = (int)
2a2e0 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29  strlen(lockPath)
2a2f0 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63  ;.  buf[0] = loc
2a300 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28  kPath[0];.  for(
2a310 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b   i=1; i<len; i++
2a320 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
2a330 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26  Path[i] == '/' &
2a340 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30  & (i - start > 0
2a350 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e  ) ){.      /* on
2a360 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66  ly mkdir if leaf
2a370 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22   dir != "." or "
2a380 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20  /" or ".." */.  
2a390 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e      if( i-start>
2a3a0 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31  2 || (i-start==1
2a3b0 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
2a3c0 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
2a3d0 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20  rt] != '/') .   
2a3e0 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72        || (i-star
2a3f0 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72  t==2 && buf[star
2a400 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
2a410 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27  [start+1] != '.'
2a420 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66  ) ){.        buf
2a430 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20  [i]='\0';.      
2a440 20 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c    if( mkdir(buf,
2a450 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2a460 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
2a470 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20  IONS) ){.       
2a480 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
2a490 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a4a0 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a  err!=EEXIST ) {.
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52              OSTR
2a4c0 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
2a4d0 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65  PATH  FAILED cre
2a4e0 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20  ating %s, ".    
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a500 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63   "'%s' proxy loc
2a510 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
2a520 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2a530 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73            buf, s
2a540 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f  trerror(err), lo
2a550 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
2a560 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2a570 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20  return err;.    
2a580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a590 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2a5a0 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d  start=i+1;.    }
2a5b0 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f  .    buf[i] = lo
2a5c0 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20  ckPath[i];.  }. 
2a5d0 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
2a5e0 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  ELOCKPATH  proxy
2a5f0 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
2a600 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74  d=%d\n", lockPat
2a610 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
2a620 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2a630 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
2a640 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69   VFS file descri
2a650 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20  ptor (stored in 
2a660 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
2a670 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  from.** sqlite3_
2a680 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e  malloc) and open
2a690 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20   the file named 
2a6a0 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69  "path" in the fi
2a6b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
2a6c0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
2a6d0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e  is responsible n
2a6e0 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73  ot only for clos
2a6f0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73  ing the file des
2a700 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61  criptor.** but a
2a710 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20  lso for freeing 
2a720 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  the memory assoc
2a730 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
2a740 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
2a750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2a760 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
2a770 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e(.    const cha
2a780 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20  r *path,        
2a790 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20  /* path for the 
2a7a0 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a  new unixFile */.
2a7b0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70      unixFile **p
2a7c0 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20  pFile,       /* 
2a7d0 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64  unixFile created
2a7e0 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79   and returned by
2a7f0 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20   ref */.    int 
2a800 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20  islockfile      
2a810 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a       /* if non z
2a820 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73  ero missing dirs
2a830 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
2a840 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64   */.) {.  int fd
2a850 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72   = -1;.  int dir
2a860 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46  fd = -1;.  unixF
2a870 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ile *pNew;.  int
2a880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a890 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
2a8a0 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
2a8b0 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  EAT;.  sqlite3_v
2a8c0 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69  fs dummyVfs;.  i
2a8d0 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20  nt terrno = 0;. 
2a8e0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2a8f0 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a  Unused = NULL;..
2a900 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72    /* 1. first tr
2a910 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  y to open/create
2a920 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32   the file.  ** 2
2a930 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c  . if that fails,
2a940 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c   and this is a l
2a950 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f  ock file (not-co
2a960 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69  nch), try creati
2a970 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65  ng.  ** the pare
2a980 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61  nt directories a
2a990 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69  nd then try agai
2a9a0 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68  n..  ** 3. if th
2a9b0 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f  at fails, try to
2a9c0 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72   open the file r
2a9d0 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74  ead-only.  ** ot
2a9e0 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42  herwise return B
2a9f0 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c  USY (if lock fil
2aa00 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66  e) or CANTOPEN f
2aa10 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  or the conch fil
2aa20 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64  e.  */.  pUnused
2aa30 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
2aa40 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  d(path, openFlag
2aa50 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65  s);.  if( pUnuse
2aa60 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55  d ){.    fd = pU
2aa70 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c  nused->fd;.  }el
2aa80 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  se{.    pUnused 
2aa90 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2aaa0 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
2aab0 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e  ));.    if( !pUn
2aac0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65  used ){.      re
2aad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2aae0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
2aaf0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66  f( fd<0 ){.    f
2ab00 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f  d = open(path, o
2ab10 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45  penFlags, SQLITE
2ab20 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2ab30 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
2ab40 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  terrno = errno;.
2ab50 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
2ab60 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26  errno==ENOENT &&
2ab70 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20   islockfile ){. 
2ab80 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72       if( proxyCr
2ab90 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74  eateLockPath(pat
2aba0 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  h) == SQLITE_OK 
2abb0 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20  ){.        fd = 
2abc0 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
2abd0 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46  lags, SQLITE_DEF
2abe0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2abf0 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a  SIONS);.      }.
2ac00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2ac10 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  fd<0 ){.    open
2ac20 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
2ac30 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
2ac40 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
2ac50 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ac60 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
2ac70 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20  );.    terrno = 
2ac80 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28  errno;.  }.  if(
2ac90 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28   fd<0 ){.    if(
2aca0 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20   islockfile ){. 
2acb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2acc0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
2acd0 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e     switch (terrn
2ace0 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20  o) {.      case 
2acf0 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20  EACCES:.        
2ad00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2ad10 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45  RM;.      case E
2ad20 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74  IO: .        ret
2ad30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2ad40 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74  _LOCK; /* even t
2ad50 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20  hough it is the 
2ad60 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64  conch */.      d
2ad70 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
2ad80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
2ad90 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2ada0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77   }.  }.  .  pNew
2adb0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73   = (unixFile *)s
2adc0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
2add0 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
2ade0 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
2adf0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2ae00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
2ae10 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f  o end_create_pro
2ae20 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  xy;.  }.  memset
2ae30 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
2ae40 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70  (unixFile));.  p
2ae50 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  New->openFlags =
2ae60 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 64 75   openFlags;.  du
2ae70 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20  mmyVfs.pAppData 
2ae80 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  = (void*)&autolo
2ae90 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 70 55  ckIoFinder;.  pU
2aea0 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
2aeb0 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73    pUnused->flags
2aec0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
2aed0 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20  pNew->pUnused = 
2aee0 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63  pUnused;.  .  rc
2aef0 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
2af00 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c  e(&dummyVfs, fd,
2af10 20 64 69 72 66 64 2c 20 28 73 71 6c 69 74 65 33   dirfd, (sqlite3
2af20 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74  _file*)pNew, pat
2af30 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  h, 0, 0);.  if( 
2af40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2af50 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70  .    *ppFile = p
2af60 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  New;.    return 
2af70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65  SQLITE_OK;.  }.e
2af80 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a  nd_create_proxy:
2af90 20 20 20 20 0a 20 20 63 6c 6f 73 65 28 66 64 29      .  close(fd)
2afa0 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
2afb0 61 6b 20 66 64 20 69 66 20 65 72 72 6f 72 2c 20  ak fd if error, 
2afc0 77 65 27 72 65 20 61 6c 72 65 61 64 79 20 69 6e  we're already in
2afd0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69   error */.  sqli
2afe0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
2aff0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2b000 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72  Unused);.  retur
2b010 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
2b020 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73  SQLITE_TEST./* s
2b030 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
2b040 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
2b050 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
2b060 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69   file paths */.i
2b070 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  nt sqlite3_hosti
2b080 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  d_num = 0;.#endi
2b090 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  f..#define PROXY
2b0a0 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36  _HOSTIDLEN    16
2b0b0 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
2b0c0 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a  host id length *
2b0d0 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73  /../* Not always
2b0e0 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
2b0f0 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75  headers as it ou
2b100 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74  ght to be */.ext
2b110 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75  ern int gethostu
2b120 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63  uid(uuid_t id, c
2b130 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
2b140 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a  spec *wait);../*
2b150 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44   get the host ID
2b160 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64   via gethostuuid
2b170 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74  (), pHostID must
2b180 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f   point to PROXY_
2b190 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79  HOSTIDLEN .** by
2b1a0 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20  tes of writable 
2b1b0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
2b1c0 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
2b1d0 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68  stID(unsigned ch
2b1e0 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
2b1f0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 73 74 72   *pError){.  str
2b200 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d  uct timespec tim
2b210 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f  eout = {1, 0}; /
2b220 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20  * 1 sec timeout 
2b230 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 50  */.  .  assert(P
2b240 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
2b250 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
2b260 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73  );.  memset(pHos
2b270 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f  tID, 0, PROXY_HO
2b280 53 54 49 44 4c 45 4e 29 3b 0a 20 20 69 66 28 20  STIDLEN);.  if( 
2b290 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73  gethostuuid(pHos
2b2a0 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29  tID, &timeout) )
2b2b0 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20  {.    int err = 
2b2c0 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70  errno;.    if( p
2b2d0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
2b2e0 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
2b2f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
2b300 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
2b310 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2b320 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74  EST.  /* simulat
2b330 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
2b340 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
2b350 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
2b360 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73  paths */.  if( s
2b370 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2b380 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f  m != 0){.    pHo
2b390 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29  stID[0] = (char)
2b3a0 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63  (pHostID[0] + (c
2b3b0 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73  har)(sqlite3_hos
2b3c0 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29  tid_num & 0xFF))
2b3d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2b3e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b3f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f  OK;.}../* The co
2b400 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nch file contain
2b410 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f  s the header, ho
2b420 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66  st id and lock f
2b430 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65  ile path. */.#de
2b440 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48  fine PROXY_CONCH
2b450 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31  VERSION 2   /* 1
2b460 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36  -byte header, 16
2b470 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70  -byte host id, p
2b480 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ath */.#define P
2b490 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20  ROXY_HEADERLEN  
2b4a0 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66    1   /* conch f
2b4b0 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74  ile header lengt
2b4c0 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
2b4d0 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20  XY_PATHINDEX    
2b4e0 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
2b4f0 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
2b500 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ).#define PROXY_
2b510 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52  MAXCONCHLEN  (PR
2b520 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
2b530 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41  OXY_HOSTIDLEN+MA
2b540 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a  XPATHLEN)../* .*
2b550 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20  * Takes an open 
2b560 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69  conch file, copi
2b570 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
2b580 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e  to a new path an
2b590 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a  d then moves .**
2b5a0 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e   it back.  The n
2b5b0 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c  ewly created fil
2b5c0 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  e's file descrip
2b5d0 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20  tor is assigned 
2b5e0 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20  to the.** conch 
2b5f0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  file structure a
2b600 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f  nd finally the o
2b610 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69  riginal conch fi
2b620 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
2b630 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65   .** closed.  Re
2b640 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75  turns zero if su
2b650 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61  ccessful..*/.sta
2b660 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65  tic int proxyBre
2b670 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78  akConchLock(unix
2b680 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69  File *pFile, uui
2b690 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20  d_t myHostID){. 
2b6a0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2b6b0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
2b6c0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2b6d0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
2b6e0 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
2b6f0 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
2b700 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
2b710 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74  ile;.  char tPat
2b720 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
2b730 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f   char buf[PROXY_
2b740 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
2b750 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43  char *cPath = pC
2b760 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
2b770 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64  h;.  size_t read
2b780 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f  Len = 0;.  size_
2b790 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20  t pathLen = 0;. 
2b7a0 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d   char errmsg[64]
2b7b0 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20   = "";.  int fd 
2b7c0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d  = -1;.  int rc =
2b7d0 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41   -1;.  UNUSED_PA
2b7e0 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44  RAMETER(myHostID
2b7f0 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20  );..  /* create 
2b800 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65  a new path by re
2b810 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69  place the traili
2b820 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68  ng '-conch' with
2b830 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70   '-break' */.  p
2b840 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79  athLen = strlcpy
2b850 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d  (tPath, cPath, M
2b860 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66  AXPATHLEN);.  if
2b870 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54  ( pathLen>MAXPAT
2b880 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c  HLEN || pathLen<
2b890 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c  6 || .     (strl
2b8a0 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c  cpy(&tPath[pathL
2b8b0 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20  en-5], "break", 
2b8c0 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20  6) != 5) ){.    
2b8d0 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20  sprintf(errmsg, 
2b8e0 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e  "path error (len
2b8f0 20 25 64 29 22 2c 20 28 69 6e 74 29 70 61 74 68   %d)", (int)path
2b900 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Len);.    goto e
2b910 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
2b920 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20  }.  /* read the 
2b930 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f  conch content */
2b940 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 70 72 65  .  readLen = pre
2b950 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
2b960 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43   buf, PROXY_MAXC
2b970 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69  ONCHLEN, 0);.  i
2b980 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59  f( readLen<PROXY
2b990 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20  _PATHINDEX ){.  
2b9a0 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67    sprintf(errmsg
2b9b0 2c 20 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c  , "read error (l
2b9c0 65 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 72 65  en %d)", (int)re
2b9d0 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  adLen);.    goto
2b9e0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
2b9f0 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69    }.  /* write i
2ba00 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d  t out to the tem
2ba10 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c  porary break fil
2ba20 65 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e  e */.  fd = open
2ba30 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c  (tPath, (O_RDWR|
2ba40 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c  O_CREAT|O_EXCL),
2ba50 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ba60 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
2ba70 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
2ba80 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72  .    sprintf(err
2ba90 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69  msg, "create fai
2baa0 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
2bab0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
2bac0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
2bad0 20 69 66 28 20 70 77 72 69 74 65 28 66 64 2c 20   if( pwrite(fd, 
2bae0 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29  buf, readLen, 0)
2baf0 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 61   != (ssize_t)rea
2bb00 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 70 72 69  dLen ){.    spri
2bb10 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 77 72 69  ntf(errmsg, "wri
2bb20 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
2bb30 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
2bb40 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
2bb50 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d  .  }.  if( renam
2bb60 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20  e(tPath, cPath) 
2bb70 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65  ){.    sprintf(e
2bb80 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66  rrmsg, "rename f
2bb90 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
2bba0 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
2bbb0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2bbc0 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72  .  rc = 0;.  fpr
2bbd0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72  intf(stderr, "br
2bbe0 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f  oke stale lock o
2bbf0 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b  n %s\n", cPath);
2bc00 0a 20 20 63 6c 6f 73 65 28 63 6f 6e 63 68 46 69  .  close(conchFi
2bc10 6c 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e 63 68 46  le->h);.  conchF
2bc20 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63  ile->h = fd;.  c
2bc30 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
2bc40 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
2bc50 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65  _CREAT;..end_bre
2bc60 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63  aklock:.  if( rc
2bc70 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d   ){.    if( fd>=
2bc80 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  0 ){.      unlin
2bc90 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20  k(tPath);.      
2bca0 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
2bcb0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
2bcc0 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  err, "failed to 
2bcd0 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b  break stale lock
2bce0 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63   on %s, %s\n", c
2bcf0 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20  Path, errmsg);. 
2bd00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2bd10 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72  }../* Take the r
2bd20 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e  equested lock on
2bd30 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2bd40 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c  and break a stal
2bd50 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a  e lock if the .*
2bd60 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  * host id matche
2bd70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2bd80 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
2bd90 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
2bda0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
2bdb0 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b  , int lockType){
2bdc0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
2bdd0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
2bde0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2bdf0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
2be00 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
2be10 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2be20 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
2be30 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  hFile;.  int rc 
2be40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2be50 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20  nt nTries = 0;. 
2be60 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
2be70 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20   conchModTime;. 
2be80 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20   .  do {.    rc 
2be90 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
2bea0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
2beb0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2bec0 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
2bed0 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a  .    nTries ++;.
2bee0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bef0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
2bf00 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20   /* If the lock 
2bf10 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20  failed (busy):. 
2bf20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a        * 1st try:
2bf30 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d   get the mod tim
2bf40 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20  e of the conch, 
2bf50 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72  wait 0.5s and tr
2bf60 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20  y again. .      
2bf70 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c   * 2nd try: fail
2bf80 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65   if the mod time
2bf90 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74   changed or host
2bfa0 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74   id is different
2bfb0 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a  , wait .       *
2bfc0 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65             10 se
2bfd0 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a  c and try again.
2bfe0 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79         * 3rd try
2bff0 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  : break the lock
2c000 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20   unless the mod 
2c010 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64  time has changed
2c020 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
2c030 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
2c040 66 3b 0a 20 20 20 20 20 20 69 66 28 20 66 73 74  f;.      if( fst
2c050 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  at(conchFile->h,
2c060 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20   &buf) ){.      
2c070 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
2c080 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
2c090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c0a0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
2c0b0 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
2c0c0 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31     if( nTries==1
2c0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63   ){.        conc
2c0e0 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73  hModTime = buf.s
2c0f0 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20  t_mtimespec;.   
2c100 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30       usleep(5000
2c110 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35  00); /* wait 0.5
2c120 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
2c130 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20   lock again*/.  
2c140 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
2c150 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
2c160 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e   assert( nTries>
2c170 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  1 );.      if( c
2c180 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73  onchModTime.tv_s
2c190 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
2c1a0 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c  mespec.tv_sec ||
2c1b0 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68   .         conch
2c1c0 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20  ModTime.tv_nsec 
2c1d0 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
2c1e0 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20  pec.tv_nsec ){. 
2c1f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c200 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
2c210 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2c220 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b  if( nTries==2 ){
2c230 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20    .        char 
2c240 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  tBuf[PROXY_MAXCO
2c250 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
2c260 20 69 6e 74 20 6c 65 6e 20 3d 20 70 72 65 61 64   int len = pread
2c270 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74  (conchFile->h, t
2c280 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
2c290 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  NCHLEN, 0);.    
2c2a0 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b      if( len<0 ){
2c2b0 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
2c2c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2c2d0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
2c2e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2c2f0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
2c300 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
2c310 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en>PROXY_PATHIND
2c320 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28  EX && tBuf[0]==(
2c330 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
2c340 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20  VERSION){.      
2c350 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65      /* don't bre
2c360 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74  ak the lock if t
2c370 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e  he host id doesn
2c380 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  't match */.    
2c390 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d        if( 0!=mem
2c3a0 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f  cmp(&tBuf[PROXY_
2c3b0 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
2c3c0 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54  stID, PROXY_HOST
2c3d0 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  IDLEN) ){.      
2c3e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2c3f0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
2c400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2c410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2c420 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
2c430 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20  e lock on short 
2c440 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f  read or a versio
2c450 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20  n mismatch */.  
2c460 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2c470 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2c480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73      }.        us
2c490 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20  leep(10000000); 
2c4a0 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61  /* wait 10 sec a
2c4b0 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
2c4c0 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
2c4d0 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20   continue; .    
2c4e0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2c4f0 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d   assert( nTries=
2c500 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =3 );.      if( 
2c510 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e  0==proxyBreakCon
2c520 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
2c530 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20  HostID) ){.     
2c540 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c550 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  K;.        if( l
2c560 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49  ockType==EXCLUSI
2c570 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
2c580 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
2c590 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
2c5a0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
2c5b0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
2c5c0 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20  ARED_LOCK);     
2c5d0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
2c5e0 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20          if( !rc 
2c5f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2c600 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
2c610 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
2c620 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2c630 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
2c640 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c650 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69   }.    }.  } whi
2c660 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
2c670 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20  USY && nTries<3 
2c680 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  );.  .  return r
2c690 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74  c;.}../* Takes t
2c6a0 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69  he conch by taki
2c6b0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
2c6c0 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f   and read the co
2c6d0 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66  ntents conch, if
2c6e0 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73   .** lockPath is
2c6f0 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68   non-NULL, the h
2c700 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20  ost ID and lock 
2c710 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d  file path must m
2c720 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a  atch.  A NULL .*
2c730 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73  * lockPath means
2c740 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61   that the lockPa
2c750 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
2c760 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
2c770 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  d if the .** hos
2c780 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20  t IDs match, or 
2c790 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20  a new lock path 
2c7a0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2c7b0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
2c7c0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20  .** and written 
2c7d0 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  to the conch fil
2c7e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2c7f0 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
2c800 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
2c810 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
2c820 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
2c830 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
2c840 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
2c850 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
2c860 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f   .  if( pCtx->co
2c870 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20  nchHeld!=0 ){.  
2c880 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c890 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2c8a0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
2c8b0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
2c8c0 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64  chFile;.    uuid
2c8d0 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20  _t myHostID;.   
2c8e0 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b   int pError = 0;
2c8f0 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75  .    char readBu
2c900 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
2c910 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c  LEN];.    char l
2c920 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  ockPath[MAXPATHL
2c930 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74  EN];.    char *t
2c940 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55  empLockPath = NU
2c950 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  LL;.    int rc =
2c960 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c970 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20  int createConch 
2c980 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73  = 0;.    int hos
2c990 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20  tIdMatch = 0;.  
2c9a0 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20    int readLen = 
2c9b0 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c  0;.    int tryOl
2c9c0 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
2c9d0 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c     int forceNewL
2c9e0 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
2c9f0 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22   .    OSTRACE(("
2ca00 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f  TAKECONCH  %d fo
2ca10 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
2ca20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
2ca30 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78             (pCtx
2ca40 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2ca50 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ? pCtx->lockProx
2ca60 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  yPath : ":auto:"
2ca70 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a  ), getpid()));..
2ca80 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65      rc = proxyGe
2ca90 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44  tHostID(myHostID
2caa0 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  , &pError);.    
2cab0 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  if( (rc&0xff)==S
2cac0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
2cad0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
2cae0 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a  Errno = pError;.
2caf0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
2cb00 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
2cb10 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f      rc = proxyCo
2cb20 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
2cb30 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f  yHostID, SHARED_
2cb40 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
2cb50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cb60 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
2cb70 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
2cb80 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20      /* read the 
2cb90 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66  existing conch f
2cba0 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c  ile */.    readL
2cbb0 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  en = seekAndRead
2cbc0 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63  ((unixFile*)conc
2cbd0 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75  hFile, 0, readBu
2cbe0 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
2cbf0 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  HLEN);.    if( r
2cc00 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  eadLen<0 ){.    
2cc10 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20    /* I/O error: 
2cc20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
2cc30 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
2cc40 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
2cc50 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69  tErrno = conchFi
2cc60 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
2cc70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2cc80 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20  _IOERR_READ;.   
2cc90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
2cca0 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65  conch;.    }else
2ccb0 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50   if( readLen<=(P
2ccc0 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
2ccd0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
2cce0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
2ccf0 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68   readBuf[0]!=(ch
2cd00 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
2cd10 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f  RSION ){.      /
2cd20 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f  * a short read o
2cd30 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74  r version format
2cd40 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20   mismatch means 
2cd50 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
2cd60 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a  e a new .      *
2cd70 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20  * conch file. . 
2cd80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72       */.      cr
2cd90 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20  eateConch = 1;. 
2cda0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74     }.    /* if t
2cdb0 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  he host id match
2cdc0 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  es and the lock 
2cdd0 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69  path already exi
2cde0 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  sts in the conch
2cdf0 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72  .    ** we'll tr
2ce00 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74  y to use the pat
2ce10 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63  h there, if we c
2ce20 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70  an't open that p
2ce30 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20  ath, we'll .    
2ce40 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20  ** retry with a 
2ce50 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74  new auto-generat
2ce60 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a  ed path .    */.
2ce70 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63      do { /* in c
2ce80 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74  ase we need to t
2ce90 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20  ry again for an 
2cea0 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63  :auto: named loc
2ceb0 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  k file */..     
2cec0 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63   if( !createConc
2ced0 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f  h && !forceNewLo
2cee0 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
2cef0 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20    hostIdMatch = 
2cf00 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66  !memcmp(&readBuf
2cf10 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
2cf20 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20  ], myHostID, .  
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf50 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2cf60 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20  ;.        /* if 
2cf70 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61  the conch has da
2cf80 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  ta compare the c
2cf90 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  ontents */.     
2cfa0 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
2cfb0 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
2cfc0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20           /* for 
2cfd0 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c  auto-named local
2cfe0 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74   lock file, just
2cff0 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20   check the host 
2d000 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20  ID and we'll.   
2d010 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74          ** use t
2d020 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  he local lock fi
2d030 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61  le path that's a
2d040 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a  lready in there.
2d050 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2d060 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74          if( host
2d070 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  IdMatch ){.     
2d080 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61         size_t pa
2d090 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e  thLen = (readLen
2d0a0 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   - PROXY_PATHIND
2d0b0 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EX);.           
2d0c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   .            if
2d0d0 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41  ( pathLen>=MAXPA
2d0e0 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  THLEN ){.       
2d0f0 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d         pathLen=M
2d100 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20  AXPATHLEN-1;.   
2d110 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d120 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f         memcpy(lo
2d130 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66  ckPath, &readBuf
2d140 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
2d150 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  ], pathLen);.   
2d160 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74           lockPat
2d170 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a  h[pathLen] = 0;.
2d180 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70              temp
2d190 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
2d1a0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ath;.           
2d1b0 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
2d1c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2d1d0 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70   /* create a cop
2d1e0 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61  y of the lock pa
2d1f0 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  th if the conch 
2d200 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
2d210 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2d220 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
2d230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d240 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64  }else if( hostId
2d250 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  Match.          
2d260 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70       && !strncmp
2d270 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
2d280 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50  Path, &readBuf[P
2d290 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
2d2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d2b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
2d2c0 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len-PROXY_PATHIN
2d2d0 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  DEX).        ){.
2d2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e            /* con
2d2f0 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b  ch host and lock
2d300 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20   path match */. 
2d310 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2d320 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20  d_takeconch; .  
2d330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d340 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
2d350 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e  if the conch isn
2d360 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20  't writable and 
2d370 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77  doesn't match, w
2d380 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20  e can't take it 
2d390 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f  */.      if( (co
2d3a0 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
2d3b0 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20  gs&O_RDWR) == 0 
2d3c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2d3d0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2d3e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
2d3f0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d  keconch;.      }
2d400 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
2d410 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63   either the conc
2d420 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f  h didn't match o
2d430 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  r we need to cre
2d440 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f  ate a new one */
2d450 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78  .      if( !pCtx
2d460 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2d470 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
2d480 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78  GetLockPath(pCtx
2d490 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61  ->dbPath, lockPa
2d4a0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
2d4b0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63  .        tempLoc
2d4c0 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68  kPath = lockPath
2d4d0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65  ;.        /* cre
2d4e0 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
2d4f0 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c  e lock path _onl
2d500 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  y_ if the conch 
2d510 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
2d520 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2d530 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68   /* update conch
2d540 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70   with host and p
2d550 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66  ath (this will f
2d560 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f  ail if other pro
2d570 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61  cess.      ** ha
2d580 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
2d590 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65  already), if the
2d5a0 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
2d5b0 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20  , use the big.  
2d5c0 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20      ** stick..  
2d5d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74      */.      fut
2d5e0 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  imes(conchFile->
2d5f0 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  h, NULL);.      
2d600 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20  if( hostIdMatch 
2d610 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20  && !createConch 
2d620 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
2d630 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  onchFile->pInode
2d640 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70   && conchFile->p
2d650 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
2d660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2d670 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
2d680 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
2d690 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
2d6a0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
2d6b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
2d6c0 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
2d6d0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
2d6e0 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
2d6f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2d700 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
2d710 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20    } else {      
2d720 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72      .          r
2d730 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  c = proxyConchLo
2d740 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
2d750 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ID, EXCLUSIVE_LO
2d760 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
2d770 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d780 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
2d790 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
2d7a0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2d7b0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43  *)conchFile, EXC
2d7c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2d7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d7e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d7f0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72  .        char wr
2d800 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2d810 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
2d820 20 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53        int writeS
2d830 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ize = 0;.       
2d840 20 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42   .        writeB
2d850 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72  uffer[0] = (char
2d860 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
2d870 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ION;.        mem
2d880 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
2d890 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
2d8a0 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
2d8b0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20  XY_HOSTIDLEN);. 
2d8c0 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
2d8d0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d  >lockProxyPath!=
2d8e0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
2d8f0 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65    strlcpy(&write
2d900 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54  Buffer[PROXY_PAT
2d910 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c  HINDEX], pCtx->l
2d920 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41  ockProxyPath, MA
2d930 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
2d940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d950 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69      strlcpy(&wri
2d960 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
2d970 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c  ATHINDEX], tempL
2d980 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
2d990 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEN);.        }.
2d9a0 20 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a          writeSiz
2d9b0 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  e = PROXY_PATHIN
2d9c0 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72  DEX + strlen(&wr
2d9d0 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2d9e0 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20  PATHINDEX]);.   
2d9f0 20 20 20 20 20 66 74 72 75 6e 63 61 74 65 28 63       ftruncate(c
2da00 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69  onchFile->h, wri
2da10 74 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  teSize);.       
2da20 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28   rc = unixWrite(
2da30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
2da40 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65  conchFile, write
2da50 42 75 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a  Buffer, writeSiz
2da60 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  e, 0);.        f
2da70 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  sync(conchFile->
2da80 68 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  h);.        /* I
2da90 66 20 77 65 20 63 72 65 61 74 65 64 20 61 20 6e  f we created a n
2daa0 65 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e  ew conch file (n
2dab0 6f 74 20 6a 75 73 74 20 75 70 64 61 74 65 64 20  ot just updated 
2dac0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2dad0 61 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 76  a .         ** v
2dae0 61 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65 29  alid conch file)
2daf0 2c 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74  , try to match t
2db00 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
2db10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
2db20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2db30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2db40 54 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65 43  TE_OK && createC
2db50 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  onch ){.        
2db60 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
2db70 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  f;.          int
2db80 20 65 72 72 20 3d 20 66 73 74 61 74 28 70 46 69   err = fstat(pFi
2db90 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  le->h, &buf);.  
2dba0 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 3d          if( err=
2dbb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2dbc0 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d    mode_t cmode =
2dbd0 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f   buf.st_mode&(S_
2dbe0 49 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20  IRUSR|S_IWUSR | 
2dbf0 53 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20  S_IRGRP|S_IWGRP 
2dc00 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc20 20 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54            S_IROT
2dc30 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20  H|S_IWOTH);.    
2dc40 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74          /* try t
2dc50 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61  o match the data
2dc60 62 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65  base file R/W pe
2dc70 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72  rmissions, ignor
2dc80 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66  e failure */.#if
2dc90 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58  ndef SQLITE_PROX
2dca0 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20 20  Y_DEBUG.        
2dcb0 20 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68      fchmod(conch
2dcc0 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b  File->h, cmode);
2dcd0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
2dce0 20 20 20 69 66 28 20 66 63 68 6d 6f 64 28 63 6f     if( fchmod(co
2dcf0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64  nchFile->h, cmod
2dd00 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
2dd10 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
2dd20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
2dd30 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
2dd40 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
2dd50 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
2dd60 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
2dd80 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  ode, code, strer
2dd90 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20  ror(code));.    
2dda0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2ddb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
2ddc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ddd0 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44  fchmod %o SUCCED
2dde0 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20  ED\n",cmode);.  
2ddf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2de00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2de10 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
2de20 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
2de30 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
2de40 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49  tderr, "STAT FAI
2de50 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20  LED[%d] with %d 
2de60 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
2de70 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c              err,
2de80 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
2de90 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20  code));.#endif. 
2dea0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2deb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2dec0 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
2ded0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
2dee0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2def0 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
2df00 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20  LOCK);.      .  
2df10 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a    end_takeconch:
2df20 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
2df30 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
2df40 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
2df50 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ->h));.      if(
2df60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2df70 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  & pFile->openFla
2df80 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  gs ){.        if
2df90 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
2dfa0 0a 23 69 66 64 65 66 20 53 54 52 49 43 54 5f 43  .#ifdef STRICT_C
2dfb0 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20 20 20 20  LOSE_ERROR.     
2dfc0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70       if( close(p
2dfd0 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20  File->h) ){.    
2dfe0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
2dff0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
2e000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
2e010 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2e020 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20  R_CLOSE;.       
2e030 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
2e040 20 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65       close(pFile
2e050 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  ->h); /* silentl
2e060 79 20 6c 65 61 6b 20 66 64 20 69 66 20 66 61 69  y leak fd if fai
2e070 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  l */.#endif.    
2e080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46      }.        pF
2e090 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20  ile->h = -1;.   
2e0a0 20 20 20 20 20 69 6e 74 20 66 64 20 3d 20 6f 70       int fd = op
2e0b0 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  en(pCtx->dbPath,
2e0c0 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67   pFile->openFlag
2e0d0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2e0e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2e0f0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2e100 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20  MISSIONS);.     
2e110 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41     OSTRACE(("TRA
2e120 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25  NSPROXY: OPEN  %
2e130 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20  d\n", fd));.    
2e140 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
2e150 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
2e160 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  ->h = fd;.      
2e170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e180 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e     rc=SQLITE_CAN
2e190 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53  TOPEN_BKPT; /* S
2e1a0 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78  QLITE_BUSY? prox
2e1b0 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65  yTakeConch calle
2e1c0 64 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72  d.           dur
2e1d0 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ing locking */. 
2e1e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e1f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2e200 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74  QLITE_OK && !pCt
2e210 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a  x->lockProxy ){.
2e220 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61          char *pa
2e230 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74  th = tempLockPat
2e240 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h ? tempLockPath
2e250 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   : pCtx->lockPro
2e260 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  xyPath;.        
2e270 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
2e280 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26  UnixFile(path, &
2e290 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c  pCtx->lockProxy,
2e2a0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
2e2b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
2e2c0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
2e2d0 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b  EM && tryOldLock
2e2e0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
2e2f0 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74    /* we couldn't
2e300 20 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78   create the prox
2e310 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68  y lock file with
2e320 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69   the old lock fi
2e330 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20  le path.        
2e340 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61     ** so try aga
2e350 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69  in via auto-nami
2e360 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ng .           *
2e370 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63  /.          forc
2e380 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31  eNewLockPath = 1
2e390 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f  ;.          tryO
2e3a0 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ldLockPath = 0;.
2e3b0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2e3c0 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74  ue; /* go back t
2e3d0 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c  o the do {} whil
2e3e0 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74  e start point, t
2e3f0 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ry again */.    
2e400 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e410 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e430 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
2e440 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20   a copy of path 
2e450 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20  if we extracted 
2e460 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
2e470 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63     ** from the c
2e480 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65  onch file or the
2e490 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61   path was alloca
2e4a0 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ted on the stack
2e4b0 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
2e4c0 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63       if( tempLoc
2e4d0 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
2e4e0 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
2e4f0 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
2e500 44 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70  DbStrDup(0, temp
2e510 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20  LockPath);.     
2e520 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
2e530 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
2e540 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2e550 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2e560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e570 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e580 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e5a0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2e5b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   = 1;.        . 
2e5c0 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
2e5d0 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74  >lockProxy->pMet
2e5e0 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  hod == &afpIoMet
2e5f0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20  hods ){.        
2e600 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
2e610 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20  ext *afpCtx;.   
2e620 20 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20         afpCtx = 
2e630 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
2e640 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50  xt *)pCtx->lockP
2e650 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  roxy->lockingCon
2e660 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
2e670 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d  afpCtx->dbPath =
2e680 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
2e690 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Path;.        }.
2e6a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
2e6b0 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65         conchFile
2e6c0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
2e6d0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2e6e0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
2e6f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
2e700 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
2e710 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c  AKECONCH  %d %s\
2e720 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
2e730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22   rc==SQLITE_OK?"
2e750 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a  ok":"failed"));.
2e760 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2e770 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29  .    } while (1)
2e780 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20  ; /* in case we 
2e790 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68  need to retry th
2e7a0 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69  e :auto: lock fi
2e7b0 6c 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20  le - .          
2e7c0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f         ** we sho
2e7d0 75 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65  uld never get he
2e7e0 72 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68  re except via th
2e7f0 65 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c  e 'continue' cal
2e800 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  l. */.  }.}../*.
2e810 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64  ** If pFile hold
2e820 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f  s a lock on a co
2e830 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72  nch file, then r
2e840 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b  elease that lock
2e850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e860 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
2e870 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
2e880 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
2e890 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2e8a0 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
2e8b0 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
2e8c0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2e8d0 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20  text *pCtx;  /* 
2e8e0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  The locking cont
2e8f0 65 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78  ext for the prox
2e900 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78  y lock */.  unix
2e910 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b  File *conchFile;
2e920 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2e930 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  of the conch fil
2e940 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28  e */..  pCtx = (
2e950 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2e960 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
2e970 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63  kingContext;.  c
2e980 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
2e990 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53  >conchFile;.  OS
2e9a0 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43  TRACE(("RELEASEC
2e9b0 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20  ONCH  %d for %s 
2e9c0 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68  pid=%d\n", conch
2e9d0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
2e9e0 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50      (pCtx->lockP
2e9f0 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d  roxyPath ? pCtx-
2ea00 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a  >lockProxyPath :
2ea10 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20   ":auto:"), .   
2ea20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29          getpid()
2ea30 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  ));.  if( pCtx->
2ea40 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
2ea50 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
2ea60 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
2ea70 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
2ea80 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
2ea90 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43  _LOCK);.  }.  pC
2eaa0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
2eab0 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  0;.  OSTRACE(("R
2eac0 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20  ELEASECONCH  %d 
2ead0 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %s\n", conchFile
2eae0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
2eaf0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
2eb00 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
2eb10 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
2eb20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
2eb30 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
2eb40 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f  atabase file, co
2eb50 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  mpute the name o
2eb60 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65  f its conch file
2eb70 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63  ..** Store the c
2eb80 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e  onch filename in
2eb90 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
2eba0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2ebb0 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20  lloc()..** Make 
2ebc0 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e  *pConchPath poin
2ebd0 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d  t to the new nam
2ebe0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
2ebf0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
2ec00 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
2ec10 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  EM if unable to 
2ec20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  obtain memory..*
2ec30 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
2ec40 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2ec50 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  or ensuring that
2ec60 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
2ec70 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69  emory.** space i
2ec80 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  s eventually fre
2ec90 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63  ed..**.** *pConc
2eca0 68 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20  hPath is set to 
2ecb0 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79  NULL if a memory
2ecc0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
2ecd0 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
2ece0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
2ecf0 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65  ateConchPathname
2ed00 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63  (char *dbPath, c
2ed10 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68  har **pConchPath
2ed20 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
2ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed40 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2ed50 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20  er */.  int len 
2ed60 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
2ed70 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68  Path); /* Length
2ed80 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
2ed90 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a  ename - dbPath *
2eda0 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50  /.  char *conchP
2edb0 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
2edc0 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77    /* buffer in w
2edd0 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63  hich to construc
2ede0 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a  t conch name */.
2edf0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
2ee00 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  pace for the con
2ee10 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  ch filename and 
2ee20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e  initialize the n
2ee30 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ame to.  ** the 
2ee40 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67  name of the orig
2ee50 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
2ee60 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e  le. */  .  *pCon
2ee70 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61  chPath = conchPa
2ee80 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  th = (char *)sql
2ee90 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20  ite3_malloc(len 
2eea0 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63  + 8);.  if( conc
2eeb0 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  hPath==0 ){.    
2eec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2eed0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  MEM;.  }.  memcp
2eee0 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50  y(conchPath, dbP
2eef0 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a  ath, len+1);.  .
2ef00 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20    /* now insert 
2ef10 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65  a "." before the
2ef20 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65   last / characte
2ef30 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c  r */.  for( i=(l
2ef40 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d  en-1); i>=0; i--
2ef50 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63   ){.    if( conc
2ef60 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b  hPath[i]=='/' ){
2ef70 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
2ef80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2ef90 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69   }.  conchPath[i
2efa0 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28  ]='.';.  while (
2efb0 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f   i<len ){.    co
2efc0 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50  nchPath[i+1]=dbP
2efd0 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b  ath[i];.    i++;
2efe0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e  .  }..  /* appen
2eff0 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73  d the "-conch" s
2f000 75 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c  uffix to the fil
2f010 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63  e */.  memcpy(&c
2f020 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22  onchPath[i+1], "
2f030 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61  -conch", 7);.  a
2f040 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c  ssert( (int)strl
2f050 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d  en(conchPath) ==
2f060 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74   len+7 );..  ret
2f070 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2f080 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75  .../* Takes a fu
2f090 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70  lly configured p
2f0a0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79  roxy locking-sty
2f0b0 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64  le unix file and
2f0c0 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65   switches.** the
2f0d0 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
2f0e0 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63   path .*/.static
2f0f0 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50   int switchLockP
2f100 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c  roxyPath(unixFil
2f110 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20  e *pFile, const 
2f120 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20  char *path) {.  
2f130 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2f140 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
2f150 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2f160 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2f170 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20  Context;.  char 
2f180 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d  *oldPath = pCtx-
2f190 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
2f1a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2f1b0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69  E_OK;..  if( pFi
2f1c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
2f1d0 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  O_LOCK ){.    re
2f1e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
2f1f0 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f  ;.  }  ..  /* no
2f200 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74  thing to do if t
2f210 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c  he path is NULL,
2f220 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68   :auto: or match
2f230 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  es the existing 
2f240 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70  path */.  if( !p
2f250 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
2f260 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
2f270 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
2f280 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20  ||.    (oldPath 
2f290 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50  && !strncmp(oldP
2f2a0 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41  ath, path, MAXPA
2f2b0 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72  THLEN)) ){.    r
2f2c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f2d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
2f2e0 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
2f2f0 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
2f300 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  oxy;.    pCtx->l
2f310 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20  ockProxy=NULL;. 
2f320 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65     pCtx->conchHe
2f330 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ld = 0;.    if( 
2f340 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20  lockProxy!=NULL 
2f350 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b  ){.      rc=lock
2f360 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
2f370 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
2f380 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79  file *)lockProxy
2f390 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2f3a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2f3b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2f3c0 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
2f3d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2f3e0 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20  ee(oldPath);.   
2f3f0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
2f400 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
2f410 53 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b  StrDup(0, path);
2f420 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e  .  }.  .  return
2f430 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46   rc;.}../*.** pF
2f440 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68  ile is a file th
2f450 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e  at has been open
2f460 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f  ed by a prior xO
2f470 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74  pen call.  dbPat
2f480 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67  h.** is a string
2f490 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74   buffer at least
2f4a0 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68   MAXPATHLEN+1 ch
2f4b0 61 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65  aracters in size
2f4c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2f4d0 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69  tine find the fi
2f4e0 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65  lename associate
2f4f0 64 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64  d with pFile and
2f500 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e   writes it.** in
2f510 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61  t dbPath..*/.sta
2f520 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
2f530 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
2f540 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
2f550 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29  e, char *dbPath)
2f560 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  {.#if defined(__
2f570 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70  APPLE__).  if( p
2f580 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
2f590 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
2f5a0 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79  {.    /* afp sty
2f5b0 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66 65 72  le keeps a refer
2f5c0 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20 70  ence to the db p
2f5d0 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50  ath in the fileP
2f5e0 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a  ath field .    *
2f5f0 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 20  * of the struct 
2f600 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
2f610 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72  int)strlen((char
2f620 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2f630 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54  Context)<=MAXPAT
2f640 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c  HLEN );.    strl
2f650 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66  cpy(dbPath, ((af
2f660 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
2f670 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2f680 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68  Context)->dbPath
2f690 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2f6a0 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20   } else.#endif. 
2f6b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
2f6c0 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  hod == &dotlockI
2f6d0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2f6e0 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c  /* dot lock styl
2f6f0 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  e uses the locki
2f700 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74  ng context to st
2f710 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b  ore the dot lock
2f720 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74  .    ** file pat
2f730 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e  h */.    int len
2f740 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20   = strlen((char 
2f750 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2f760 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65  Context) - strle
2f770 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  n(DOTLOCK_SUFFIX
2f780 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  );.    memcpy(db
2f790 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46  Path, (char *)pF
2f7a0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
2f7b0 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20  ext, len + 1);. 
2f7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61   }else{.    /* a
2f7d0 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20  ll other styles 
2f7e0 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  use the locking 
2f7f0 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65  context to store
2f800 20 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74   the db file pat
2f810 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  h */.    assert(
2f820 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70   strlen((char*)p
2f830 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2f840 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45  text)<=MAXPATHLE
2f850 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79  N );.    strlcpy
2f860 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a  (dbPath, (char *
2f870 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2f880 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c  ontext, MAXPATHL
2f890 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  EN);.  }.  retur
2f8a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2f8b0 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61  /*.** Takes an a
2f8c0 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e  lready filled in
2f8d0 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61   unix file and a
2f8e0 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20  lters it so all 
2f8f0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  file locking .**
2f900 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d   will be perform
2f910 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ed on the local 
2f920 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e  proxy lock file.
2f930 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2f940 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72  fields.** are pr
2f950 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c  eserved in the l
2f960 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73  ocking context s
2f970 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
2f980 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
2f990 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72  .** the unix str
2f9a0 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20  ucture properly 
2f9b0 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c  cleaned up at cl
2f9c0 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e  ose time:.**  ->
2f9d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a  lockingContext.*
2f9e0 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a  *  ->pMethod.*/.
2f9f0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2fa00 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
2fa10 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
2fa20 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  e, const char *p
2fa30 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ath) {.  proxyLo
2fa40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2fa50 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74  tx;.  char dbPat
2fa60 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b  h[MAXPATHLEN+1];
2fa70 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2fa80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2fa90 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
2faa0 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20  ockPath=NULL;.  
2fab0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2fac0 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69  OK;.  .  if( pFi
2fad0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
2fae0 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  O_LOCK ){.    re
2faf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
2fb00 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74  ;.  }.  proxyGet
2fb10 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
2fb20 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29  e(pFile, dbPath)
2fb30 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c  ;.  if( !path ||
2fb40 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c   path[0]=='\0' |
2fb50 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20  | !strcmp(path, 
2fb60 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20  ":auto:") ){.   
2fb70 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a   lockPath=NULL;.
2fb80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63    }else{.    loc
2fb90 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61  kPath=(char *)pa
2fba0 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54  th;.  }.  .  OST
2fbb0 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
2fbc0 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  Y  %d for %s pid
2fbd0 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
2fbe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f  ,.           (lo
2fbf0 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74  ckPath ? lockPat
2fc00 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
2fc10 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43  etpid()));..  pC
2fc20 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
2fc30 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  loc( sizeof(*pCt
2fc40 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78  x) );.  if( pCtx
2fc50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2fc60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2fc70 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74    }.  memset(pCt
2fc80 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  x, 0, sizeof(*pC
2fc90 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72  tx));..  rc = pr
2fca0 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
2fcb0 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26  thname(dbPath, &
2fcc0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
2fcd0 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ath);.  if( rc==
2fce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fcf0 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
2fd00 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e  eUnixFile(pCtx->
2fd10 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26  conchFilePath, &
2fd20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c  pCtx->conchFile,
2fd30 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
2fd40 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
2fd50 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65   && ((pFile->ope
2fd60 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d  nFlags&O_RDWR) =
2fd70 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  = 0) ){.      /*
2fd80 20 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e   if (a) the open
2fd90 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f   flags are not O
2fda0 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63  _RDWR, (b) the c
2fdb0 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65  onch isn't there
2fdc0 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  , and.      ** (
2fdd0 63 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  c) the file syst
2fde0 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  em is read-only,
2fdf0 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d   then enable no-
2fe00 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a  locking access..
2fe10 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69        ** Ugh, si
2fe20 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78  nce O_RDONLY==0x
2fe30 30 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72  0000 we test for
2fe40 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75   !O_RDWR since u
2fe50 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a  nixOpen asserts.
2fe60 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70        ** that op
2fe70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76  enFlags will hav
2fe80 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f  e only one of O_
2fe90 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52  RDONLY or O_RDWR
2fea0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2feb0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
2fec0 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  sInfo;.      str
2fed0 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e  uct stat conchIn
2fee0 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f  fo;.      int go
2fef0 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20  Lockless = 0;.. 
2ff00 20 20 20 20 20 69 66 28 20 73 74 61 74 28 70 43       if( stat(pC
2ff10 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
2ff20 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d  h, &conchInfo) =
2ff30 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20  = -1 ) {.       
2ff40 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f   int err = errno
2ff50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  ;.        if( (e
2ff60 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28  rr==ENOENT) && (
2ff70 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20 26  statfs(dbPath, &
2ff80 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29  fsInfo) != -1) )
2ff90 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f  {.          goLo
2ffa0 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f  ckless = (fsInfo
2ffb0 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f  .f_flags&MNT_RDO
2ffc0 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e  NLY) == MNT_RDON
2ffd0 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  LY;.        }.  
2ffe0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2fff0 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20  goLockless ){.  
30000 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63        pCtx->conc
30010 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72  hHeld = -1; /* r
30020 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63  ead only FS/ loc
30030 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20  kless */.       
30040 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30060 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53   }  .  if( rc==S
30070 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b  QLITE_OK && lock
30080 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78  Path ){.    pCtx
30090 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
300a0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
300b0 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a  p(0, lockPath);.
300c0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
300d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
300e0 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73  pCtx->dbPath = s
300f0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
30100 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69  , dbPath);.    i
30110 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d  f( pCtx->dbPath=
30120 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72  =NULL ){.      r
30130 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
30140 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
30150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30160 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65  ){.    /* all me
30170 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65  mory is allocate
30180 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63 72  d, proxys are cr
30190 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e  eated and assign
301a0 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74  ed, .    ** swit
301b0 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  ch the locking c
301c0 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68  ontext and pMeth
301d0 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a  od then return..
301e0 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d      */.    pCtx-
301f0 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
30200 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt = pFile->lock
30210 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
30220 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
30230 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20  ntext = pCtx;.  
30240 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68    pCtx->pOldMeth
30250 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  od = pFile->pMet
30260 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  hod;.    pFile->
30270 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79  pMethod = &proxy
30280 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
30290 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78  se{.    if( pCtx
302a0 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a  ->conchFile ){ .
302b0 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63        pCtx->conc
302c0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
302d0 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
302e0 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e  file *)pCtx->con
302f0 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73  chFile);.      s
30300 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
30310 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  ->conchFile);.  
30320 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
30330 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50  free(pCtx->lockP
30340 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
30350 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
30360 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
30370 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ; .    sqlite3_f
30380 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20  ree(pCtx);.  }. 
30390 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53   OSTRACE(("TRANS
303a0 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c  PROXY  %d %s\n",
303b0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
303c0 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54        (rc==SQLIT
303d0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
303e0 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74  ailed")));.  ret
303f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
30400 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
30410 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66  andles sqlite3_f
30420 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61  ile_control() ca
30430 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73 70 65  lls that are spe
30440 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78  cific.** to prox
30450 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  y locking..*/.st
30460 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
30470 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
30480 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
30490 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
304a0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
304b0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
304c0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
304d0 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  LE: {.      unix
304e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
304f0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
30500 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d     if( pFile->pM
30510 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49  ethod == &proxyI
30520 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
30530 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
30540 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
30550 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
30560 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  text*)pFile->loc
30570 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
30580 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f       proxyTakeCo
30590 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
305a0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
305b0 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
305c0 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74           *(const
305d0 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
305e0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
305f0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ath;.        }el
30600 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  se{.          *(
30610 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
30620 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f  rg = ":auto: (no
30630 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20  t held)";.      
30640 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65    }.      } else
30650 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e   {.        *(con
30660 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
30670 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  = NULL;.      }.
30680 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
30690 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
306a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45    case SQLITE_SE
306b0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
306c0 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c   {.      unixFil
306d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
306e0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20  File*)id;.      
306f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30700 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  OK;.      int is
30710 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46  ProxyStyle = (pF
30720 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
30730 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29  &proxyIoMethods)
30740 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  ;.      if( pArg
30750 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74  ==NULL || (const
30760 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20   char *)pArg==0 
30770 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
30780 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20  sProxyStyle ){. 
30790 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e           /* turn
307a0 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69   off proxy locki
307b0 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74  ng - not support
307c0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
307d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
307e0 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f  R /*SQLITE_PROTO
307f0 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55  COL? SQLITE_MISU
30800 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d  SE?*/;.        }
30810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30820 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78  /* turn off prox
30830 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65  y locking - alre
30840 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a  ady off - NOOP *
30850 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
30860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30870 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
30880 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  e{.        const
30890 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68   char *proxyPath
308a0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
308b0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69  )pArg;.        i
308c0 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  f( isProxyStyle 
308d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f  ){.          pro
308e0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
308f0 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20   *pCtx = .      
30900 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b        (proxyLock
30910 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c  ingContext*)pFil
30920 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
30930 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  t;.          if(
30940 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22   !strcmp(pArg, "
30950 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20  :auto:") .      
30960 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c       || (pCtx->l
30970 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a  ockProxyPath &&.
30980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
30990 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f  strncmp(pCtx->lo
309a0 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f  ckProxyPath, pro
309b0 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  xyPath, MAXPATHL
309c0 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  EN)).          )
309d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
309e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
309f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30a00 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30a10 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50  switchLockProxyP
30a20 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79  ath(pFile, proxy
30a30 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  Path);.         
30a40 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
30a50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  {.          /* t
30a60 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c  urn on proxy fil
30a70 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  e locking */.   
30a80 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
30a90 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
30aa0 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50  le(pFile, proxyP
30ab0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ath);.        }.
30ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
30ad0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
30ae0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
30af0 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
30b00 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73    /* The call as
30b10 73 75 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20  sures that only 
30b20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72  valid opcodes ar
30b30 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a  e sent */.    }.
30b40 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
30b50 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51  ED*/.  return SQ
30b60 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
30b70 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
30b80 20 64 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70   division (the p
30b90 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
30ba0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20  implementation) 
30bb0 74 68 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a  the procedures.*
30bc0 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69  * above this poi
30bd0 6e 74 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69  nt are all utili
30be0 74 69 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d  ties.  The lock-
30bf0 72 65 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20  related methods 
30c00 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d  of the.** proxy-
30c10 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  locking sqlite3_
30c20 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74  io_method object
30c30 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a   follow..*/.../*
30c40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
30c50 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
30c60 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
30c70 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
30c80 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
30c90 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
30ca0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
30cb0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
30cc0 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
30cd0 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
30ce0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
30cf0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
30d00 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
30d10 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
30d20 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
30d30 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
30d40 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
30d50 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
30d60 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
30d70 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63  ic int proxyChec
30d80 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
30d90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
30da0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
30db0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
30dc0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
30dd0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72  d;.  int rc = pr
30de0 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
30df0 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  le);.  if( rc==S
30e00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30e10 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
30e20 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
30e30 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
30e40 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
30e50 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66  gContext;.    if
30e60 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
30e70 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69  d>0 ){.      uni
30e80 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
30e90 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
30ea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f        return pro
30eb0 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68  xy->pMethod->xCh
30ec0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
30ed0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
30ee0 72 6f 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a  roxy, pResOut);.
30ef0 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f      }else{ /* co
30f00 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
30f10 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20  ockless */.     
30f20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20 20 20 20   pResOut=0;.    
30f30 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
30f40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
30f50 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
30f60 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
30f70 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
30f80 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
30f90 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
30fa0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
30fb0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
30fc0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
30fd0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
30fe0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
30ff0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
31000 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
31010 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
31020 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
31030 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
31040 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
31050 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
31060 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
31070 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
31080 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
31090 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
310a0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
310b0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
310c0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
310d0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
310e0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
310f0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
31100 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
31110 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
31120 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
31130 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
31140 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
31150 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
31160 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
31170 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
31180 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
31190 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
311a0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
311b0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
311c0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
311d0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
311e0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
311f0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
31200 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
31210 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
31220 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
31230 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
31240 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
31250 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
31260 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
31270 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
31280 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
31290 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
312a0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
312b0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
312c0 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
312d0 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
312e0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
312f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31300 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
31310 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
31320 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
31330 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
31340 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
31350 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
31360 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  eld>0 ){.      u
31370 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d  nixFile *proxy =
31380 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
31390 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  ;.      rc = pro
313a0 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  xy->pMethod->xLo
313b0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
313c0 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f  *)proxy, eFileLo
313d0 63 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ck);.      pFile
313e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72  ->eFileLock = pr
313f0 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  oxy->eFileLock;.
31400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31410 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20   /* conchHeld < 
31420 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  0 is lockless */
31430 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
31440 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
31450 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
31460 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
31470 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
31480 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
31490 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
314a0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
314b0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
314c0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
314d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
314e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
314f0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
31500 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
31510 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
31520 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
31530 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
31540 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
31550 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63  c int proxyUnloc
31560 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
31570 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
31580 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
31590 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
315a0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
315b0 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
315c0 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
315d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
315e0 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
315f0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
31600 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
31610 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
31620 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
31630 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
31640 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
31650 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
31660 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
31670 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  oxy;.      rc = 
31680 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
31690 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
316a0 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46  _file*)proxy, eF
316b0 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ileLock);.      
316c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
316d0 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c   = proxy->eFileL
316e0 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
316f0 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65        /* conchHe
31700 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
31710 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ss */.    }.  }.
31720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31730 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
31740 6c 65 20 74 68 61 74 20 75 73 65 73 20 70 72 6f  le that uses pro
31750 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  xy locks..*/.sta
31760 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
31770 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
31780 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
31790 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
317a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
317b0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f 78  le*)id;.    prox
317c0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
317d0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
317e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
317f0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
31800 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69  text;.    unixFi
31810 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  le *lockProxy = 
31820 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
31830 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  .    unixFile *c
31840 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
31850 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20  >conchFile;.    
31860 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
31870 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  OK;.    .    if(
31880 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20   lockProxy ){.  
31890 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f      rc = lockPro
318a0 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  xy->pMethod->xUn
318b0 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
318c0 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e  le*)lockProxy, N
318d0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  O_LOCK);.      i
318e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
318f0 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  c;.      rc = lo
31900 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
31910 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
31920 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78  3_file*)lockProx
31930 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
31940 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31950 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
31960 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  (lockProxy);.   
31970 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
31980 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xy = 0;.    }.  
31990 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 20    if( conchFile 
319a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 74  ){.      if( pCt
319b0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 29 7b 0a  x->conchHeld ){.
319c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
319d0 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 70  xyReleaseConch(p
319e0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69  File);.        i
319f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
31a00 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
31a10 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
31a20 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
31a30 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
31a40 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
31a50 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
31a60 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
31a70 74 65 33 5f 66 72 65 65 28 63 6f 6e 63 68 46 69  te3_free(conchFi
31a80 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  le);.    }.    s
31a90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
31aa0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29  ->lockProxyPath)
31ab0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
31ac0 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
31ad0 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  lePath);.    sql
31ae0 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
31af0 64 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20  dbPath);.    /* 
31b00 72 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67  restore the orig
31b10 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  inal locking con
31b20 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64  text and pMethod
31b30 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a   then close it *
31b40 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  /.    pFile->loc
31b50 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
31b60 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
31b70 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65  ntext;.    pFile
31b80 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78  ->pMethod = pCtx
31b90 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20  ->pOldMethod;.  
31ba0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31bb0 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ctx);.    return
31bc0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
31bd0 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d  >xClose(id);.  }
31be0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
31bf0 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66  _OK;.}....#endif
31c00 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
31c10 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
31c20 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
31c30 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
31c40 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
31c50 20 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64   style is intend
31c60 65 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  ed for use with 
31c70 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  AFP filesystems.
31c80 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46  .** And since AF
31c90 50 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  P is only suppor
31ca0 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74  ted on MacOSX, t
31cb0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
31cc0 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74   is also.** rest
31cd0 72 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58  ricted to MacOSX
31ce0 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ..** .**.*******
31cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
31d00 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
31d10 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
31d20 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
31d30 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
31d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31d80 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
31d90 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
31da0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
31db0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
31dc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
31dd0 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20  gisters all VFS 
31de0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
31df0 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70  for unix-like op
31e00 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65  erating.** syste
31e10 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ms.  This routin
31e20 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  e, and the sqlit
31e30 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74  e3_os_end() rout
31e40 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ine that follows
31e50 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74  ,.** should be t
31e60 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73  he only routines
31e70 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68   in this file th
31e80 61 74 20 61 72 65 20 76 69 73 69 62 6c 65 20 66  at are visible f
31e90 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c  rom other.** fil
31ea0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
31eb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
31ec0 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c   once during SQL
31ed0 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ite initializati
31ee0 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73  on and by a.** s
31ef0 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54  ingle thread.  T
31f00 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
31f10 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73  tion and mutex s
31f20 75 62 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e  ubsystems have n
31f30 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  ot.** necessaril
31f40 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  y been initializ
31f50 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ed when this rou
31f60 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
31f70 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73  and so they.** s
31f80 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65  hould not be use
31f90 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
31fa0 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
31fb0 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65   .  /* .  ** The
31fc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
31fd0 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74   defines an init
31fe0 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73  ializer for an s
31ff0 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
32000 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65  t..  ** The name
32010 20 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e   of the VFS is N
32020 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61  AME.  The pAppDa
32030 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ta is a pointer 
32040 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a  to a pointer.  *
32050 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72  * to the "finder
32060 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41  " function.  (pA
32070 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e  ppData is a poin
32080 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ter to a pointer
32090 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69   because.  ** si
320a0 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70 72  lly C90 rules pr
320b0 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66  ohibit a void* f
320c0 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74  rom being cast t
320d0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
320e0 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f  nter.  ** and so
320f0 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74   we have to go t
32100 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72  hrough the inter
32110 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20  mediate pointer 
32120 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
32130 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70  s.  ** when comp
32140 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61  iling with -peda
32150 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47  ntic-errors on G
32160 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  CC.).  **.  ** T
32170 68 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65  he FINDER parame
32180 74 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ter to this macr
32190 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
321a0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
321b0 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d  the.  ** finder-
321c0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66  function.  The f
321d0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72  inder-function r
321e0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
321f0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c   to the.  ** sql
32200 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  ite_io_methods o
32210 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
32220 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69 72 65  ments the desire
32230 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62  d locking.  ** b
32240 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74  ehaviors.  See t
32250 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76  he division abov
32260 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
32270 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20  the IOMETHODS.  
32280 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64  ** macro for add
32290 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ition informatio
322a0 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63  n on finder-func
322b0 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
322c0 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69   Most finders si
322d0 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f  mply return a po
322e0 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
322f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
32300 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e  ods.  ** object.
32310 20 20 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c    But the "autol
32320 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61  ockIoFinder" ava
32330 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
32340 20 64 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20   does a little. 
32350 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   ** more than th
32360 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20  at; it looks at 
32370 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
32380 79 70 65 20 74 68 61 74 20 68 6f 73 74 73 20 74  ype that hosts t
32390 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
323a0 65 20 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73  e file and tries
323b0 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f   to choose an lo
323c0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70  cking method app
323d0 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a  ropriate for.  *
323e0 2a 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65  * that filesyste
323f0 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23  m time..  */.  #
32400 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56  define UNIXVFS(V
32410 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20  FSNAME, FINDER) 
32420 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
32430 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 32           \.    2
32440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32450 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
32460 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
32470 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a         \.    siz
32480 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20  eof(unixFile),  
32490 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
324a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
324b0 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50       \.    MAX_P
324c0 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  ATHNAME,        
324d0 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
324e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
324f0 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20     \.    0,     
32500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32510 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20  * pNext */      
32520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32530 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20   \.    VFSNAME, 
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32550 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  zName */        
32560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
32570 0a 20 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e  .    (void*)&FIN
32580 44 45 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41  DER,       /* pA
32590 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20  ppData */       
325a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
325b0 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20     unixOpen,    
325c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
325d0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
325e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
325f0 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
32600 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
32610 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
32620 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
32630 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20  nixAccess,      
32640 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
32650 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
32660 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
32670 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  xFullPathname,  
32680 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
32690 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
326a0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
326b0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
326c0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20   /* xDlOpen */  
326d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326e0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45     \.    unixDlE
326f0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
32700 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20  * xDlError */   
32710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32720 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d   \.    unixDlSym
32730 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32740 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20  xDlSym */       
32750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
32760 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65  .    unixDlClose
32770 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
32780 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  lClose */       
32790 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
327a0 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73     unixRandomnes
327b0 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
327c0 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20  domness */      
327d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
327e0 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20   unixSleep,     
327f0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
32800 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
32810 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
32820 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  nixCurrentTime, 
32830 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
32840 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Time */         
32850 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
32860 78 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  xGetLastError,  
32870 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
32880 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
32890 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43       \.    unixC
328a0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
328b0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
328c0 49 6e 74 36 34 20 2a 2f 20 20 20 20 20 20 20 20  Int64 */        
328d0 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     \.  }..  /*. 
328e0 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20   ** All default 
328f0 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61  VFSes for unix a
32900 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
32910 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
32920 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  ray..  **.  ** N
32930 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c  ote that the sql
32940 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66  ite3_vfs.pNext f
32950 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20  ield of the VFS 
32960 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69  object is modifi
32970 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53  ed.  ** by the S
32980 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20  QLite core when 
32990 74 68 65 20 56 46 53 20 69 73 20 72 65 67 69 73  the VFS is regis
329a0 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66  tered.  So the f
329b0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72  ollowing.  ** ar
329c0 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ray cannot be co
329d0 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74  nst..  */.  stat
329e0 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61  ic sqlite3_vfs a
329f0 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51  Vfs[] = {.#if SQ
32a00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
32a10 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 28 4f 53  ING_STYLE && (OS
32a20 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69  _VXWORKS || defi
32a30 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a  ned(__APPLE__)).
32a40 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
32a50 78 22 2c 20 20 20 20 20 20 20 20 20 20 61 75 74  x",          aut
32a60 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  olockIoFinder ),
32a70 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56  .#else.    UNIXV
32a80 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
32a90 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65      posixIoFinde
32aa0 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  r ),.#endif.    
32ab0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f  UNIXVFS("unix-no
32ac0 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49  ne",     nolockI
32ad0 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
32ae0 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74  NIXVFS("unix-dot
32af0 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49  file",  dotlockI
32b00 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f  oFinder ),.#if O
32b10 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e  S_VXWORKS.    UN
32b20 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65  IXVFS("unix-name
32b30 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64  dsem", semIoFind
32b40 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66  er ),.#endif.#if
32b50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
32b60 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
32b70 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70   UNIXVFS("unix-p
32b80 6f 73 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49  osix",    posixI
32b90 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 21  oFinder ),.#if !
32ba0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55  OS_VXWORKS.    U
32bb0 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f  NIXVFS("unix-flo
32bc0 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46  ck",    flockIoF
32bd0 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
32be0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
32bf0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
32c00 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
32c10 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
32c20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61   UNIXVFS("unix-a
32c30 66 70 22 2c 20 20 20 20 20 20 61 66 70 49 6f 46  fp",      afpIoF
32c40 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
32c50 58 56 46 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c  XVFS("unix-nfs",
32c60 20 20 20 20 20 20 6e 66 73 49 6f 46 69 6e 64 65        nfsIoFinde
32c70 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
32c80 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20  ("unix-proxy",  
32c90 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 20    proxyIoFinder 
32ca0 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  ),.#endif.  };. 
32cb0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
32cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
32cd0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
32ce0 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
32cf0 56 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e  VFSes defined in
32d00 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61   the aVfs[] arra
32d10 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  y */.  for(i=0; 
32d20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f  i<(sizeof(aVfs)/
32d30 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76  sizeof(sqlite3_v
32d40 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  fs)); i++){.    
32d50 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
32d60 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69  ster(&aVfs[i], i
32d70 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ==0);.  }.  retu
32d80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
32d90 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
32da0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
32db0 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
32dc0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72  .**.** Some oper
32dd0 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69  ating systems mi
32de0 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73  ght need to do s
32df0 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74  ome cleanup in t
32e00 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  his routine,.** 
32e10 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d  to release dynam
32e20 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
32e30 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e   objects.  But n
32e40 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54  ot on unix..** T
32e50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
32e60 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e   no-op for unix.
32e70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
32e80 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20  os_end(void){ . 
32e90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32ea0 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f  K; .}. .#endif /
32eb0 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  * SQLITE_OS_UNIX
32ec0 20 2a 2f 0a                                       */.